Medium!
題目描述:
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換后的鏈表。
示例:
給定1->2->3->4
, 你應該返回2->1->4->3
.
說明:
- 你的算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
解題思路:
這道題不算難,是基本的鏈表操作題,我們可以分別用遞歸和迭代來實現。對於迭代實現,還是需要建立dummy節點,注意在連接節點的時候,最好畫個圖,以免把自己搞暈了。
C++解法一:
1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 ListNode *dummy = new ListNode(-1), *pre = dummy; 5 dummy->next = head; 6 while (pre->next && pre->next->next) { 7 ListNode *t = pre->next->next; 8 pre->next->next = t->next; 9 t->next = pre->next; 10 pre->next = t; 11 pre = t->next; 12 } 13 return dummy->next; 14 } 15 };
遞歸的寫法就更簡潔了,實際上利用了回溯的思想,遞歸遍歷到鏈表末尾,然后先交換末尾兩個,然后依次往前交換。
C++解法二:
1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 if (!head || !head->next) return head; 5 ListNode *t = head->next; 6 head->next = swapPairs(head->next->next); 7 t->next = head; 8 return t; 9 } 10 };