leetcode 24: 两两交换链表中的节点
题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
, 你应该返回2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际
解析:
1 ListNode* swapPairs(ListNode* head) { 2 if(head == nullptr) 3 return head; 4 ListNode *p = head, *q = head->next, *m = head; 5 if(q != nullptr) 6 { 7 head = q; 8 m = p; 9 } 10 int c = 0; 11 while(nullptr != q) 12 { 13 if(c) 14 { 15 m->next = q; 16 m = p; 17 } 18 p->next = q->next; 19 q->next = p; 20 p = p->next; 21 if(nullptr != p) 22 q = p->next; 23 else 24 break; 25 c++; 26 } 27 return head; 28 }
这种方法中p,q指向需要交换的两个节点, m永远指向被交换两个节点前的节点, 通过m把交换后的两个节点与已经交换完成的节点连接起来, 总体空间复杂度O(1),