labuladong算法框架 Python版 之 反转链表的一部分

反转链表的一部分 迭代方式

建议配合labuladong大佬的反转链表的一部分食用

〇、链表实现

class Node:
    def __init__(self,item):
        self.item = item
        self.next = None

class SingleNode:
    def __init__(self):
        self._head = None

    def is_empty(self):
        return self._head is None

    def length(self):
        count = 0
        cur = self._head
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def traverse(self):
        cur = self._head
        while cur is not None:
            yield cur.item
            cur = cur.next

    def appendleft(self,item):
        node = Node(item)
        node.next = self._head
        self._head = node
        
    def append(self,item):
        node = Node(item)
        if self.is_empty():
            self._head = node
        else:
            cur = self._head
            while cur.next is not None:
                cur = cur.next
            cur.next = node    

    def insert(self,index,item):
        if index <= 0:
            self.appendleft(item)
        elif index >= self.length():
            self.append(item)
        else:            
            node = Node(item)
            cur = self._head
            for i in range(index-1):
                cur = cur.next
            node.next = cur.next
            cur.next = node
    def remove(self,item):
        cur = self._head
        pre = None
        while cur is not None:
            if cur.item == item:
                if pre is None:
                    self._head = cur.next
                else:
                    pre.next = cur.next
                return True
            else:
                pre = cur
                cur = cur.next
        return False
    
    def find(self,item):
        return item in self.traverse()
        
ln = SingleNode()
ln.appendleft(2)
ln.appendleft(1)
ln.append(3)
ln.append(4)
for i in ln.traverse():
    print(i)
一、递归反转整个链表
  • class Node(object):
        def __init__(self, value=None, next=None):
            self.value = value
            self.next = next
    
        @staticmethod
        def reverse(head):
            if head.next == None:
                return head
            last = reverse(head.next)
            head.next.next = head
            head.next = None
            return last
    
    ln = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9)))))))))
    root = Node.reverse(ln)
    while root:
            print(root.value)
            root =root.next
    
  • @staticmethod
    def reverse(head):
        if head.next == None:
            return head
        last = SingleNode.reverse(head.next)
        head.next.next = head
        head.next = None
        return last
    
    print('整体反转后:')
    ln._head = SingleNode.reverse(ln._head)
    
    for i in ln.traverse():
        print(i)
    
二、反转链表前 N 个节点
rear = Node()
def reverseN(head,count):
    global rear
    if count == 1:
        rear = head.next
        
        return head
    last = reverseN(head.next,count-1)
    head.next.next = head
    head.next = rear
    return last

print('反转前n个后:')
ln._head = reverseN(ln._head,3)

for i in ln.traverse():
    print(i)
三、反转链表的一部分
def reverseBetween(head,m,n):
    if m == 1:
        return reverseN(head,n)

    head.next = reverseBetween(head.next,m-1,n-1)
    return head

print('反转[m,n]后:(例:[2,4])')

ln._head = reverseBetween(ln._head,2,4)

for i in ln.traverse():
    print(i)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值