【算法】【线性表】【链表】分隔链表
1 题目
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
2 解答
还是先找到第一个节点的前一个节点,采用头插法把后边的小于的移前来,跟前两篇的头插法有一点不一样的就是 preNode 在今天这道题里因为要保持元素的相对位置,所以 preNode 是会向后移动的,也就是每往前插入一个 preNode = preNode.next,preNode也会同时移动一个元素哈:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode partition(ListNode head, int x) { // write your code here if (head == null) return head; // 先找到大于等于 x 的第一个节点的前一个节点 // 然后对后续的元素采取头插法即可 // 先加一个空的头节点,方便进行遍历 ListNode emptyNode = new ListNode(0); emptyNode.next = head; // preNode 指向 大于等于 x 的节点的前一个节点 ListNode preNode = null; // 遍历 while (emptyNode != null) { // 下一个节点 ListNode nextNode = emptyNode.next; // 下一个节点的 val 如果和 x 相等 if (nextNode != null && nextNode.val >= x) { // 将 preNode 指向当前的 emptyNode 即前一个节点 preNode = emptyNode; // 找到了就跳出循环 break; } // 继续向后遍历 emptyNode = emptyNode.next; } boolean headChange = head.val >= x; // 如果 preNode 为空 说明没有大于等于 x 的直接返回吧 if (preNode == null) return head; // 不为空话就需要把 preNode 后边的 小于 x 的节点头插法进来 ListNode node = preNode, resNode = preNode; while (node != null) { ListNode nextNode = node.next; // 如果节点的 val 小于 x if (nextNode != null && nextNode.val < x) { // 头插法进来 node.next = nextNode.next; nextNode.next = preNode.next; preNode.next = nextNode; preNode = preNode.next; continue; } // 向后移动 node = node.next; } return headChange ? resNode.next : head; } }
加油。
分类:
算法 / 链表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了