学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用Java实现:分割链表
题目描述:
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
解题思路
创建两个新链表,一个存放比给定值小的结点,一个存放比给定值大的结点,最后将两个链表拼接
- 首先判断链表为空和只有一个节点的情况
if(head==null)return null;//为空链表
if(head.next==null) return head;//只有一个节点
- 创建两个新链表
ListNode min =new ListNode(0);//创建小于给定值的链表
ListNode minTail=min;
ListNode max=new ListNode(0);//创建大于给定值的链表
ListNode maxTail=max;
ListNode cur=head;
- 通过循环比较,将相应结点存放至相应链表,将连个链表拼接起来
//比较链表节点与给定值并存入相应链表
while(cur!=null){
if(cur.val<x){
minTail.next=new ListNode(cur.val);//后插入链表
minTail=minTail.next;
}else{
maxTail.next=new ListNode(cur.val);//后插入链表
maxTail=maxTail.next;
}
cur=cur.next;
}
minTail.next=max.next;//将两个链表拼接起来
实现代码
public static ListNode partition(ListNode head, int x) {
if(head==null)return null;//为空链表
if(head.next==null) return head;//只有一个节点
ListNode min =new ListNode(0);//创建小于给定值的链表
ListNode minTail=min;
ListNode max=new ListNode(0);//创建大于给定值的链表
ListNode maxTail=max;
ListNode cur=head;
//比较链表节点与给定值并存入相应链表
while(cur!=null){
if(cur.val<x){
minTail.next=new ListNode(cur.val);//后插入链表
minTail=minTail.next;
}else{
maxTail.next=new ListNode(cur.val);//后插入链表
maxTail=maxTail.next;
}
cur=cur.next;
}
minTail.next=max.next;//将两个链表拼接起来
return min.next;
}