题目链接:24.两两交换链表中的节点
题解:
链表的指针切换问题!
题目简述:
给定一个链表,两两相邻的做一下交换。
我的错误题解:
我的代码如下: l指向 2 再指向 1 ,此时2到3已经断了,会发现1和2已经成环了,会形成死循环!
我看了好久,都没发现2到3已经断了,还以为head->next->next为3了,懵逼了!
以此为戒:做链表题一定要画好图,看清哪里断了,哪里没断!

错误代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Solution { public: ListNode* swapPairs(ListNode* head) { auto dummy = new ListNode(-1), l = dummy; while(head){ l->next = head->next; l = head->next; l->next = head; l = head; head = head->next->next; } return dummy->next; } };
|
题解:
使用两个指针,(类似双指针解法),一个指向带翻转的第一个,一个指向第二个。如下图:
第二步一定要在第三步之前,否则下一个节点就找不到了!
p永远指向下一组节点的上一个节点,a、b永远指向下一组节点。
- 要严格保证后面有两个节点或以上才可以,
p->next && p->next->next,即这两个节点非空!

AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Solution { public: ListNode* swapPairs(ListNode* head) { auto dummy = new ListNode(-1), p = dummy; dummy->next = head; while(p->next && p->next->next){ auto a = p->next, b = a->next; p->next = b; a->next = b->next; b->next = a; p = a; } return dummy->next; } };
|