Leetcode系列之链表(6)
题目
给出一个链表和一个值x,以x为参照将链表划分成两部分,使所有小于x的节点都位于大于或等于x的节点之前。
两个部分之内的节点之间要保持的原始相对顺序。
例如:
给出1->4->3->2->5->2和x = 3,
返回1->2->2->4->3->5.
思路:
1.直接创建两个链表:一个链表存放小于x的元素,另一个存放大于或等于x的元素
2.然后迭代访问整个链表,将元素插入before或者after链表末尾。一旦抵达链表末端,则表明拆分完毕,最后合并两个链表
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
ListNode node=head;
if( node== null){
return null;
}
ListNode beforeStart= null;
ListNode beforeEnd= null;
ListNode afterStart= null;
ListNode afterEnd= null;
while( node!= null){
ListNode next= node. next;
//将链表存储在next中
node. next= null;
//将node的next清零表示,只是添加一个节点,而非以该节点为头结点的链表
if( node.val< x){
if( beforeStart== null){
beforeStart= node;
beforeEnd= beforeStart;
} else{
beforeEnd. next= node;
beforeEnd= node;
}
} else{
if( afterStart== null){
afterStart= node;
afterEnd= afterStart;
} else{
afterEnd. next= node;
afterEnd= node;
}
}
node= next; }
if( beforeStart== null)
return afterStart;
//合并
beforeEnd. next= afterStart;
return beforeStart;
}
}