LeetCode 328. 奇偶連結串列(Odd Even Linked List)
阿新 • • 發佈:2018-11-05
題目描述
給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。
請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。
示例1
輸入: 1->2->3->4->5->NULL
輸出: 1->3->5->2->4->NULL
示例2
輸入: 2->1->3->5->6->4->7->NULL 輸出: 2->3->6->7->1->5->4->NULL
說明
應當保持奇數節點和偶數節點的相對順序。
連結串列的第一個節點視為奇數節點,第二個節點視為偶數節點,以此類推。
解題思路
這裡用了四個指標,其中p1搜尋奇數位,p3指的就是偶數位第一位,p2搜尋偶數位,tmp是一個輔助指標,指的是當前最後一個奇數位。一直迴圈下去直到p2->next= =NULL或者p2= =NULL,這兩種情況分別是鏈長為偶數長和奇數長的break條件。
程式碼展示
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(!head||!head->next||!head->next->next){
return head;
}
ListNode *p1=head;
ListNode *p2=head->next;
ListNode *p3=head->next;
ListNode *tmp;
while (p2&&p2->next){
tmp=p2->next;
p2->next=p2->next->next;
p2=p2->next;
p1->next=tmp;
tmp->next=p3;
p1=p1->next;
}
return head;
}
};