1. 程式人生 > >reverse linklist 反轉連結串列的一部分 python

reverse linklist 反轉連結串列的一部分 python

描述:

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