记录一下第一次做出来mid难度题目 题目链接

解法一(迭代)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//本写法是我自己debug出来的,看似比较复杂,中心思想为将节点两两分割,交换后指向返回结果节点的尾部,需要考虑临时节点数量导致的拼接问题  
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode init = null;
ListNode res = init;
ListNode cur = head;
ListNode temp = null;

while (cur != null){
if (cur.next == null){
if (init.next == null){
init.next = cur;
}else if(init.next.next == null){
init.next.next = cur;
}

break;
}
temp = cur.next.next;
cur.next.next = null;
if (init == null){
pre = cur.next;
cur.next = null;
pre.next = cur;
init = pre;
res = init;
init = init.next;

}else{
pre = cur.next;
cur.next = null;
pre.next = cur;
if (init.next == null){
init.next = pre;
init = init.next;
}else if(init.next.next == null){
init.next.next = pre;
init = init.next.next;
}

}


cur = temp;
pre = pre.next.next;
}

return res;
}

解法二(递归)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//来自官方解法
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 获取当前节点的下一个节点
ListNode next = head.next;
//递归
ListNode newNode = swapPairs(next.next);

next.next = head;
head.next = newNode;

return next;
}

解法三(迭代)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//官方解法,解法一简单版,思路大致相同
public ListNode swapPairs(ListNode head) {
ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
dumyhead.next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
ListNode cur = dumyhead;
ListNode temp; // 临时节点,保存两个节点后面的节点
ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
while (cur.next != null && cur.next.next != null) {
temp = cur.next.next.next;
firstnode = cur.next;
secondnode = cur.next.next;
cur.next = secondnode; // 步骤一
secondnode.next = firstnode; // 步骤二
firstnode.next = temp; // 步骤三
cur = firstnode; // cur移动,准备下一轮交换
}
return dumyhead.next;
}