题目
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
题目链接:https://leetcode-cn.com/problems/partition-list/
思路
这里一开始,我想的是
- 根据题意将小于 x的节点单独用另一个指针指向它(并将其从链表中删除),大于等于则无需多管。
这样导致,每次迭代的时候都可能需要删除一个节点,过于麻烦了(逻辑有点绕)
于是,另一个好的想法是:
- 用两个指针,当小于 x的时候这个指针指向它,当大于等于 x的时候另一个指针指向它。
这样的思路实施起来特别简单
代码
class Solution {
public ListNode partition(ListNode head, int x) {
if(head == null) return null;
ListNode left = new ListNode(0);
ListNode right = new ListNode(0);
ListNode tempL = left;
ListNode tempR = right;
while(head != null){
// 保存当前节点的下一个节点
ListNode next = head.next;
// 然后将其断开(重要),不断开容易形成环
head.next = null;
if(head.val < x){
tempL.next = head;
tempL = tempL.next;
}else{
tempR.next = head;
tempR = tempR.next;
}
// 重新链接上
head = next;
}
// 让左边链表的最后一个 指向 右边链表
tempL.next = right.next;
return left.next;
}
}
链表的使用就是这么暴力,如果觉得自己的算法麻烦了,就多使用几个指针。