labuladong算法框架 Python版 之 如何k个一组反转链表

如何k个一组反转链表 递归方式

建议配合labuladong大佬的如何k个一组反转链表 食用

〇、链表实现

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)
一、递归反转整个链表
@staticmethod
def reverse(head):
    pre = None
    cur = head
    nxt = head
    while cur is not None:
        nxt = cur.next
        cur.next = pre

        pre = cur
        cur = nxt
    return pre

print('整体反转后:')
ln._head = SingleNode.reverse(ln._head)

for i in ln.traverse():
    print(i)
二、反转在节点B之前的链表
@staticmethod
def reverse2another(head,another):
    pre = None
    cur = head
    nxt = head
    while cur.item != another.item:
    #while cur != another:
        if cur == head:
            rear = cur
        nxt = cur.next
        cur.next = pre

        pre = cur
        cur = nxt
    rear.next = nxt
    return pre

print('反转到另一节点后:(例:Node(3))')
ln._head = SingleNode.reverse2another(ln._head,Node(3))

for i in ln.traverse():
    print(i)
三、反转链表前 N 个节点
@staticmethod
def reverseN(head,n):
    pre = None
    cur = head
    nxt = head
    for i in range(n):
        if cur == head:
            rear = cur
        nxt = cur.next
        cur.next = pre

        pre = cur
        cur = nxt
    rear.next = nxt
    return pre

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

for i in ln.traverse():
    print(i)
四、反转链表的一部分
@staticmethod
def reverseBetween(head,m,n):
    pre = None
    cur = head
    nxt = head
    for i in range(m-1):
        nxt = cur.next
        pre = cur
        cur = nxt
    for i in range(n):
        print(pre.item,cur.item,nxt.item)
        if i == 0:
            before = pre
            rear = cur
        nxt = cur.next
        cur.next = pre

        pre = cur
        cur = nxt
    rear.next = nxt
    before.next = pre
    return head

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

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

for i in ln.traverse():
    print(i)
五、K个每组反转链表
@staticmethod
def reverseKGroup(head,k):
    a = b = head
    for i in range(k):
        if b is None:
            return head
        b = b.next
    if b is None:
        last = SingleNode.reverse(a)
    else:
        last = SingleNode.reverse2another(a,b)
    a.next = SingleNode.reverseKGroup(b,k)
    return last

print('k个每组反转后:(例:2)')

ln._head = SingleNode.reverseKGroup(ln._head,2)

for i in ln.traverse():
    print(i)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值