分隔链表
Posted Delta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分隔链表相关的知识,希望对你有一定的参考价值。
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
解决思路:
从左向右遍历链表,将节点值小于x的节点交换至链表的前端,使用tag指向前端最后一个节点。
代码如下:
public static ListNode partition(ListNode head, int x) { if (head==null || head.next==null) return head; ListNode h = new ListNode(0); h.next = head; ListNode temp; ListNode p = h; ListNode tag = h; while (p.next != null) { if (p.next.val < x) { if (tag == p) { p = p.next; tag = tag.next; } else { temp = p.next; p.next = temp.next; temp.next = tag.next; tag.next = temp; tag = temp; } } else p = p.next; } return h.next; }
另一种方法是生成两个子链表,其中一个的节点值都小于x,另一个都大于等于x。
代码如下:
public static ListNode test(ListNode head, int x) { ListNode h1 = new ListNode(0); ListNode l1 = h1; ListNode h2 = new ListNode(0); ListNode l2 = h2; while(head != null) { if (head.val < x) { l1.next = head; l1 = l1.next; } else { l2.next = head; l2 = l2.next; } head = head.next; } l2.next = null; l1.next = h2.next; return h1.next; }
以上是关于分隔链表的主要内容,如果未能解决你的问题,请参考以下文章
[M链表] lc725. 分隔链表(模拟+代码优化+代码实现)
[M链表] lc725. 分隔链表(模拟+代码优化+代码实现)