leetcode86:分隔链表

本文详细解析了一种链表分隔算法,该算法能够将链表中小于特定值x的节点放置在大于或等于x的节点之前,同时保持两个分区中节点的初始相对位置不变。通过实例演示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
1.新建一个空节点指向头结点,因为可能头结点比x大,所以在head前要插入小的,不然无法插入
2.first指针指向新建空节点,遍历first.next,寻找一个节点,它的值比x小,它的next值比x大。往后比x小的值都插入在first节点的后面。(一开始考虑到first指针在插入之后初始化指向空节点,因为考虑比x小的点插入前面的时候保证是有序的,所以运行的时候Time Out了,其实只要按照保证每个节点的相对顺序,不需要排序)
3.插入的时候,首先需要一个指针指着待插的节点,然后待插节点的前一个节点的next是待插节点的next,在插入的时候,要先保证待插节点的next指向first节点的next,如果先执行first.next为待插节点,那么待查节点就无法找到本来first节点的next.

class Solution:
    def partition(self, head, x):
        """
        :type head: ListNode
        :type x: int
        :rtype: ListNode
        """
        tempNode=ListNode(None)
        #新建一个节点指向头结点,因为如果头结点比x大,那么比x小的节点就无法插入head之前
        tempNode.next=head
        first=tempNode
        if head==None:
            return None
        if head.next==None:
            return head
        while (first.next)and(first.next.val<x):
            #找到第一个比x小,next比x大的点,往后的点都插入在后面
            first=first.next
        second=first.next#从first节点后开始扫描,first节点前都比x小
        if second==None:
            return head#如果first.next为空,说明整个链表的值都比x小
        else:
            while second.next:
                if second.next.val>=x:
                    second=second.next
                else:#当找到一个值比x小时
                    temp=second.next#提取该节点
                    second.next=second.next.next
                    temp.next=first.next
                    first.next=temp#上面一行与这一行代码不能互换
                    first=first.next
        return tempNode.next

周六颓废了一天,所有的事都堆到周末。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值