LeetCode_86 分隔链表(链表题)

题目地址:https://leetcode-cn.com/problems/partition-list/description/

题目:

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

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

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

试题分析:

该题要抓住几个要点,第一是只需要进行分隔不需要排序;第二要在两个分区中保留原先初始相对位置。正是因为这两点可以让分区算法做到O(n)的时间复杂度。整个算法的核心思路是遍历真哥哥链表,当遇到比比比较值大的节点,则加到一个新链表中,同时修改原链表连接。整个过程中需要记录小数链表头和大数链表头用于遍历结束后进行大小链表拼接,还需要记录小数前置和大数前置节点用于修改链表。总的来说这道题思路不难,但是需要熟练操作链表,不然很容易导致链表操作错误。

代码:

public ListNode partition(ListNode head, int x) {
        
        //创建虚拟头节点简化后面链表修改操作,不用考虑头节点的特殊操作
        ListNode newHead = new ListNode(0);
        ListNode bigHead = new ListNode(0);
        newHead.next = head;
        ListNode smallPre = newHead;
        ListNode bigPre = bigHead;
        ListNode p = head;
        while(p!=null){
            if(p.val<x){
                //当循环节点小于比较值则小数前置节点后移一位
                smallPre = smallPre.next;
                p = p.next;
            }else{
                //大数前置的next连接到复合条件的处理节点
                bigPre.next = p;
                //大数前置节点后移一位
                bigPre = bigPre.next;
                //小数前置next指向处理节点的next节点
                smallPre.next = p.next;
                p = p.next;
            }
        }
        bigPre.next = null;
        //小数链表尾和大数链表头的next对接(去掉大数虚拟头节点)
        smallPre.next = bigHead.next;
        return newHead.next;
    }

源码路径:com.monkey01.linkedlist.PartitionList_86

配套测试代码路径:test目录com.monkey01.linkedlist.PartitionList_86Test

https://github.com/feiweiwei/LeetCode4Java.git

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,611评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,442评论 19 139
  • 一个人在深夜里总是偷偷地抹眼泪,不敢在家人面前哭泣,只有深夜里想着想着就忍不住了,我总是将事情最坏的结果浮现...
    如此甚好18阅读 1,781评论 0 0
  • 6.26 “来来来,开饭啦,今天啊,我们喝点儿酒吧。”凤九布好菜盘后,便从内室掏出来几坛酒,一脸嘚瑟地说道:“这个...
    转角花开阅读 7,517评论 1 35
  • 传送门 https://segmentfault.com/a/1190000008010666
    Bupleurum丶阅读 1,430评论 0 0