鏈表問題---按照左右半區的方式重新組合單鏈表

【題目】

  給定一個單鏈表的頭節點head,鏈表長度爲N,如果N爲偶數,那麼前N/2個節點算作左半區,後N/2個節點算作右半區;如果N爲奇數,那麼前N/2個節點算作左半區,後N/2+1個節點算作右半區。左半區從左到右依次是L1 -> L2 ->…,右半區從左到右依次是R1 -> R2 ->…,請將單鏈表調整成L1 -> R1 -> L2 -> R2 ->…的形式。

【基本思路】

  先遍歷一遍找到左半區的最後一個節點,然後將鏈表分成左右兩部分,在按照題目要求重新合併即可。

  如何找到左半區的最後一個節點?
  
  例如:1 -> 2,mid爲1;
  1 -> 2 -> 3,mid爲2;
  1 -> 2 -> 3 -> 4,mid爲2;
  1 -> 2 -> 3 -> 4 -> 5,mid爲3;
  1 -> 2 -> 3 -> 4 -> 5 -> 6,mid爲3;

  也就是說,從長度爲2開始,長度每增加2,mid就往後移動一個節點。

【代碼實現】

#python3.5
def reCombination(head):
    if head == None or head.next == None:
        return head
    mid = head
    right = head.next
    while right.next != None and right.next.next != None:
        mid = mid.next
        right = right.next.next
    right = mid.next
    mid.next = None
    cur = head
    while cur.next != None:
        rightNext = right.next
        right.next = cur.next
        cur.next = right
        cur = right.next
        right = rightNext
    cur.next = right
    return head
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章