reverse linklist 反轉連結串列的一部分 python
阿新 • • 發佈:2018-11-10
描述:
Reverse a linked list from position m to n. Do it in-place and in one-pass.For example:
Given 1->2->3->4->5->nullptr, m = 2 and n = 4,
return 1->4->3->2->5->nullptr.Note:
Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
思路:對【m, n】區間的數進行頭插法插入
程式碼如下:
# coding=utf-8 """思路就是針對反轉區間的數使用頭插法,邏輯比較繁瑣""" class LinkNode(object): # 定義連結串列節點 def __init__(self, val, nextnode=None): self.val = val self.nextnode = nextnode class Solution(object): def reverse_between(self, linkroot=None, m=0, n=0): root = LinkNode(0) # 處理反轉起始位置為1,而增加一個節點 pre = root pre.nextnode = linkroot p = linkroot t = m - 1 while t > 0: # pre 始終記錄反轉的起始位置的直接前驅 pre = p p = p.nextnode # 始終保持指向反轉的起始位置節點 t -= 1 cur = p # cur記錄每次頭插法的點 q = p.nextnode # q記錄反轉區間中的點 for _ in range(m + 1, n + 1): # 從反轉起始的下一個點開始頭插法 if q is not None: r = q.nextnode # r記錄q的直接後繼節點 pre.nextnode = q q.nextnode = cur p.nextnode = r cur = q q = r return root.nextnode if __name__ == '__main__': """1->2->3->4->5->6->7->8->9 to 1->6->5->4->3->2->7->8->9""" roota = LinkNode(1) pp = roota for i in range(2, 10): qq = LinkNode(i) pp.nextnode = qq pp = pp.nextnode root = Solution().reverse_between(roota, 2, 6) while root is not None: print root.val, root = root.nextnode