leetcode 兩兩交換連結串列中的節點
阿新 • • 發佈:2018-12-13
題目描述:
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
示例:
給定1->2->3->4
, 你應該返回2->1->4->3
.
說明:
- 你的演算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
解題思路:
定三個指標:pre指向前面節點, cur指向當前節點, post指向後面節點。指向如下:
先將pre->next指向後面的節點post , 再交換cur和post位置:cur->next = post->next; post->next = cur;
交換後變成:
移動到下一組,即3,4的一組,pre移動到 1: pre = pre->next->next; 這樣pre指向1,判斷後面是否有兩個節點,即pre-next和pre->next->next。
C++程式碼:
/** * 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) { ListNode * dummy = new ListNode(0); // 生成啞結點,並指向真正的頭結點head dummy->next = head; ListNode* pre = dummy; while(pre->next && pre->next->next){ ListNode* cur = pre->next; ListNode* post = pre->next->next; // cur和post組成當前需要交換的一組 pre->next = post; // 指向後面的節點,使其成為前面的節點 cur->next = post->next; // 交換cur和post兩個節點的位置 post->next = cur; pre = pre->next->next; // 下一組 } return dummy->next; } };