10.22分隔链表

在合并两个有序链表时让你合二为一,而这里需要分解让你把原链表一分为二。具体来说,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x,另一个链表中的元素都大于等于 x,最后再把这两条链表接到一起,就得到了题目想要的结果。

class ListNode(object):
    def __init__(self,val = 0,next=None):
        self.val = val
        self.next = next

class Linklist(object):
    def __init__(self):
        self.head = None

    def initlist(self,data):
        self.head = ListNode(data[0])
        p = self.head
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next

    def partition(self,x=int):
        # 存放小于x的链表的虚拟头结点
        dummy1 = ListNode(-1)
        # 存放大于等于x的链表虚拟头节点
        dummy2 = ListNode(-1)
        # p1,p2指针负责生成结果链表
        p1 = dummy1
        p2 = dummy2
        # p负责遍历原链表,类似合并两个有序链表的逻辑
        p = self.head
        # 这里是将一个链表分解成两个链表
        while p :
            if p.val >= x :
                p2.next = p
                p2 = p2.next
            else:
                p1.next = p
                p1 = p1.next
            temp = p.next
            p.next = None
            p = temp

        # 连接两个链表
        p1.next = dummy2.next

        return dummy1.next

    def printList(self):
        node = self.head
        while node:
            print(node.val)
            node = node.next
l1 = Linklist()
l1.initlist([1,4,3,2,5,2])  # 初始化链表
l1.head = l1.partition(3)
l1.printList()

 1,2,2,4,3,5

l1 = Linklist()
l1.initlist([1,4,3,2,5,2])
l1.printList()
l2 = Linklist()
l2.head = l1.partition(3)
l1.printList()
l2.printList()

1,4,3,2,5,2

1,2,2,4,3,5

1,2,2,4,3,5

注意:分区后的链表是新链表,而不是原链表。原链表的结构改变了,是因为在 partition 函数中,将原链表中的节点添加到了新的链表中,并且在添加节点后,将原链表中的节点断开,防止形成环。这就改变了原链表的结构。

在这个循环中,你首先判断当前节点 p 的值是否大于或等于 x,然后将 p 添加到相应的链表中。然后,你将 p 的 next 指针设置为 None,这就断开了 p 与原链表中的下一个节点的连接。最后,你将 p 设置为下一个节点,然后继续下一次循环。

这样,你就将原链表中的节点添加到了新的链表中,并且断开了原链表中的节点,这就改变了原链表的结构。

 代码可视化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值