JAVA解法
/**
* 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) {
// 分别定义储存比特定值大和比特定值小的两个链表
ListNode large = new ListNode(0);
ListNode small = new ListNode(0);
// 为两个新建的链表分别设置哑节点,即它们的 next 指针指向各自链表的头节点,这样做的目的是为了更方便地处理头节点为空的边界条件
ListNode smallHead = small;
ListNode largeHead = large;
// 当传进来的链表头节点不为空则进入循环,遍历整个链表
while (head != null) {
// 当头节点的值小于特定值时,将其拼接到 small 链表中;当头节点的值大于或等于特定值时,将其拼接到 large 链表中
if (head.val < x) {
small.next = head;
small = small.next;
} else {
large.next = head;
large = large.next;
}
head = head.next;
}
// 当传进来的链表头节点为空,则说明遍历结束,将储存比特定值大的链表的末尾指针指向 null
large.next = null;
// 将储存比特定值小的链表的末尾指针指向储存比特定值大的链表的头节点
small.next = largeHead.next;
// 返回储存比特定值小的链表的头节点即为所求
return smallHead.next;
}
}
题解分析
这道题的思路是原链表拆成两个新的链表再合起来,一个储存比特定值小的,一个储存比特定值大的。首先定义两个的链表 small 和 large,同时再定义两个哑结点,用于更方便地处理头节点为空的边界条件。当传进来的链表头节点不为空则进入循环,遍历整个链表,判断每一个值与特定值的关系,当头节点的值小于特定值时,将其拼接到 small 链表中;当头节点的值大于或等于特定值时,将其拼接到 large 链表中,直到遍历完整个链表,将上边定义的两个链表连起来即为所求。
leetcode原题:86. 分隔链表
评论区