python鍊錶 鍊錶重新排序

2021-09-25 07:14:40 字數 2503 閱讀 2105

輸入:1->2->3->4->5->6->7

輸出:1->7->2->6->3->5->4

或者輸入:1->2->3->4->5->6

輸出:1->6->2->5->3->4

思路:

1. 將1->2->3->4->5->6->7分成:1->2->3 與 4->5->6->7,將後半部分逆序7->6->5->4

2. 合併1->2->3與7->6->5->4 為1->7->2->6->3->5->4

3. 劃分:就是找到中間節點mid,作為後半部分的頭節點(注意後半部分的節點數量會比前半部分多0個或者1個節點),這裡引入了slow與fast兩個外部變數,fast一次走2步,slow一次走一步,這樣fast走完時,slow正好走了一半,從而找到中間節點,同時,還需引入slow_pre外部變數,作為slow的前乙個節點,目的是為了找到中間節點的slow時,通過slow_pre.next = none的方式,斷開鍊錶,分成2個鍊錶

4. 逆序:輸入後半段的頭節點,也就是mid,實現對鍊錶逆序操作,可參考之前的文章,此處採用插入法逆序(鍊錶逆序)

5. 合併:引入外部變數cur1, cur2用來操作兩個鍊錶,每個節點仍然是2次指標操作,但要注意,每節點指標操作結束後,需要將外部操作變數cur下移。最後當cur1遍歷結束,即cur1.next為none時,跳出迴圈,將cur1.next指向cur2,cur2為最後乙個節點。

**:

def find_mid_node(head):

# 頭節點為空,或者鍊錶為單節點,直接返回

if head is none or head.next is none:

return head

fast = head

slow = head

slow_pre = head

while fast is not none and fast.next is not none:

slow_pre = slow

slow = slow.next # 每次移動1個節點,當fast結束時,slow走了一半

fast = fast.next.next # 每次隔乙個賦值,一步走2個節點

# 需要把指向slow的指標斷了,這樣才能變成兩個鍊錶,即slow前乙個節點的next指標為空

slow_pre.next = none

return slow # slow走了鍊錶的一半,返回的值就是中間節點mid

def reverse(head):

if head is none or head.next is none:

return head

cur = head

pre = none

while cur:

nex = cur.next

cur.next = pre

pre = cur

cur = nex

head = pre

return head

def reorder(head):

if head is none or head.next is none:

return head

cur1 = head

mid = find_mid_node(head)

cur2 = reverse(mid)

# 兩個鍊錶長度相等或者差1個,只需用cur1.next作為迴圈條件,遍歷

while cur1.next is not none:

#對鍊錶1的節點2次指標操作

tmp = cur1.next

cur1.next = cur2

cur1 = tmp

#對鍊錶2的節點2次指標操作

tmp = cur2.next

cur2.next = cur1

cur2 = tmp

# cur1.next為空,跳出迴圈,指向最後乙個cur2節點

cur1.next = cur2

return cur1

# 測試

if __name__ == "__main__":

link = linkedlist()

print("********** before **********==")

link.add(1)

link.add(2)

link.add(3)

link.add(4)

link.add(5)

link.add(6)

link.print_link()

print("********** after **********==")

reorder(link.head)

link.print_link()

#結果

********** before **********==12

3456

********** after **********==16

2534

鍊錶 重新排序

給定乙個鍊錶,形式如l0 l1 l2 l3 ln 1 ln,要求重新排序成如下形式 l0 ln l1 ln 1 如給定鍊錶為1 2 3 4 5 6,則重新排序後的結果為1 6 2 5 3 4。這裡需注意的是,要求的並不是返回乙個新鍊錶,而是直接把原鍊錶重新排序,不需返回任何值。思路 此題過程稍微有點...

鍊錶 排序鍊錶

樂扣原題 definition for singly linked list.public class listnode class solution 將鍊錶轉化為陣列 listlist new arraylist while null head 陣列遞增排序 collections.sort li...

python 排序鍊錶

題目描述 在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5class listnode object 定義建立鍊錶節點的類 def init self,val,n...