【链表】分割链表
目录
1.题目描述
2.解题思路
3.解题代码
4.实现结果
1.编写代码,以给定值x为基准 将链表分割成两部分,所有小于x的节点排在大于或等于x的节点前。
给定一个链表的头指针 ListNode *phead,请返回重新排序后的头指针。
注意:分割后保持原来的数据顺序不变;不要开辟新的空间,即不要新建节点。
2.思路:
不能建新节点,但可以建新指针,利用左指针和右指针,大于基准值x的放在右指针,小于放在左指针;最后将两部连接起来返回即可。
异常处理:左边为空,就不能连起来,直接返回右指针。
3.代码:
public class parition2_4 { public static void main(String[] args) { //测试 // int [] arr={1,3,4,8,2,6,7}; int [] arr={1,3,4,6,7,1,3}; ListNode head=new ListNode(0); ListNode p=head; //构造链表 for (int i = 0; i < arr.length; i++) { p.next=new ListNode(arr[i]); p=p.next; } System.out.println(); System.out.println("before:"+head.toString()); patitionNode(head,4); System.out.println("after :"+head.toString()); } private static ListNode patitionNode(ListNode head, int x) { ListNode p=head; ListNode leftHead=null; ListNode leftTail=null; ListNode rightHead=null; ListNode rightTail=null; while(p!=null){ int pValue=p.value; if(pValue <x){//大于基准值,放到右边 if(leftTail==null){ leftHead=p; leftTail=p; }else{ leftTail.next=p; leftTail=leftTail.next; } }else{ if(rightTail==null){ rightHead=p; rightTail=p; }else{ rightTail.next=p; rightTail=rightTail.next; } } p=p.next; } if(leftHead==null){ return rightHead; } leftTail.next=rightHead; if(rightTail!=null){ rightTail.next=null; } return leftHead; } }
patition
4.实现结果