LeetCode(24): 兩兩交換鏈表中的節點


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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM