1. 程式人生 > >Leetcode題解中級篇之陣列和字串(8)奇偶連結串列

Leetcode題解中級篇之陣列和字串(8)奇偶連結串列

題目: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第一個節點實現,發現錯了. 這裡第一個奇節點就是頭結點,head

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