題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/31/linked-list/83/
題目描述:
奇偶鏈表
給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裏的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。
請嘗試使用原地算法完成。你的算法的空間複雜度應爲 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
說明:
- 應當保持奇數節點和偶數節點的相對順序。
- 鏈表的第一個節點視爲奇數節點,第二個節點視爲偶數節點,以此類推。
思路: 例如 : 1 2 3 4 5 6 7 8 我想的是,只需要1 -》3 -》5-》7 然後 7指向2-》4-》6-》8 就可以. 實現起來還是很難,看了別人的才寫出來. 一開始想,分別 循環 odd= odd.next.next; even = even.next.next ,再將odd 最後節點連上even第一個節點實現,發現錯了.
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null ||head.next == null ||head.next.next == null) return head;
ListNode odd_h = head, odd_t = head; //創建一個節點指向第一個奇節點
ListNode even_h = head.next, even_t = head.next;//創建一個節點指向第一個偶節點
//ListNode pointer = head.next.next;
while( even_t!=null && even_t.next!= null){
//odd & even are in one loop unit
odd_t.next = even_t.next;//指向偶節點後面一個奇節點
odd_t = odd_t.next; //odd_t 指向該節點
even_t.next = odd_t.next;//此時,由於奇節點已經移動,下一個偶節點便是第二個偶節點
even_t = even_t.next;//even_ 指向該節點.
}
odd_t.next = even_h;
return odd_h;
}
}