鏈接: 兩兩交換鏈表中的節點
描述:
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
注意
- 這裏需要交換的是節點本身的順序,而不是節點的val值,因此如果是有2個節點的鏈表first->last,則應該返回的新鏈表爲last->first,並且first和last的val值是不變的,此時應該修改的是first和last中的next元素
- 如果輸入爲null或者next節點爲null,則返回head
思路:
該問題可以通過遍歷和遞歸兩種方式解決。這裏討論遞歸解決辦法。所謂遞歸,實際上就是通過將問題拆分爲一個最小的、固定的解決辦法,然後再通過一組固定的規則來調用自身來解決問題。這裏的最小的、固定的解決辦法就是先解決前2個節點的交換,通過遞歸自身調用後然後將交換後的第二個節點指向遞歸返回的新鏈表即可。要注意的是,題目要求返回新的鏈表,因此函數的返回值應該是新的鏈表的頭結點,並且只有拿到新鏈表的頭節點之後才能將鏈表連接起來。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
// 1. 判定head和head->next是否爲nullptr
if (head == nullptr || head->next == nullptr) return head;
// 2. 保存next
ListNode *next = head->next;
ListNode *last = head->next->next;
// 2. 將第二個節點的next指針指向頭節點
head->next->next = head;
// 3. swap返回的是下一組交換後的頭節點,因此將第一組交換後的第二個節點——head的next指針指向返回值
ListNode *nHead = swapPairs(last);
head->next = nHead;
// 4. 返回頭交換後的頭結點
return next;
}
};