1. 程式人生 > >鏈表分割——牛客劍指offer

鏈表分割——牛客劍指offer

之前 排列 頭指針 print lse 遍歷 lis 例如 自建

題目描述:

編寫代碼,以給定值x為基準將鏈表分割成兩部分,所有小於x的結點排在大於或等於x的結點之前

給定一個鏈表的頭指針 ListNode pHead,請返回重新排列後的鏈表的頭指針。註意:分割以後保持原來的數據順序不變。

題目分析:

將鏈表分割為兩部分,以x值為分割線(x不一定存在於鏈表中):前部分鏈表結點的值是小於x的,而且這一部分各結點的順序與在原鏈表中的相對順序相同。後部分鏈表結點的值是大於等於x的,而且這一部分各結點的順序與在原鏈表中的相對順序相同。

例如,鏈表{13,7,4,2,5} 以值4分割,結果為{1,3,2,4,7,5}

鏈表{1,3,7,2,5} 以值4分割,結果為{1,3,2,7,5}

解題思路:

新建一個鏈表-->創建一個值為x的結點nodex

叠代遍歷原鏈表的結點:

  如果結點值小於x:插入到x結點nodex的前面(插入到前半部分的最後一個位置)

  如果結點指大於x:插入到新鏈表的最後面(插入到後半部分的最後一個位置)

代碼實現:(含驗證)

 1 class ListNode {
 2     int val;
 3     ListNode next = null;
 4 
 5     ListNode(int val) {
 6         this.val = val;
 7     }
 8 }
 9 public class splitList {
10 public ListNode partition(ListNode pHead, int x) { 11 if(pHead==null){ 12 return null; 13 } 14 //創建x結點作為分割前半部分和後半部分的中間結點 15 ListNode nodex=new ListNode(x); 16 //創建newHead結點方便第一個小於x值的插入 17 ListNode newHead=new ListNode(0); 18 newHead.next=nodex;
19 //創建before結點,在叠代過程中始終保持before.next=nodex 20 //從而保證小於x值的結點可以插入到nodex結點之前 21 ListNode before=newHead; 22 //創建after結點,在叠代過程中始終保持after結點是最後一個結點 23 //從而保證大於等於x值的結點可以插入鏈表的最後位置 24 ListNode after=nodex; 25 ListNode walkNode=pHead; 26 boolean isexist=false; 27 while(walkNode!=null){ 28 //如果當前節點小於x,復制結點並將其插入到xnode的前一個結點,然後移動before指針 29 if(walkNode.val<x){ 30 ListNode node=new ListNode(walkNode.val); 31 before.next=node; 32 node.next=nodex; 33 before=node; 34 } 35 //如果當前節點大於x,復制結點並將其插入到鏈表最後一個結點,然後移動after指針 36 else if(walkNode.val>=x){ 37 ListNode node=new ListNode(walkNode.val); 38 after.next=node; 39 after=node; 40 } 41 walkNode=walkNode.next; 42 } 43 //忽略自建的x結點nodex和頭結點newHead; 44 //因為x結點不一定存在於原鏈表,所以此處要將分開的前後部分相連 45 before.next=nodex.next; 46 return newHead.next; 47 } 48 public static void main(String []args){ 49 ListNode head = new ListNode(3); 50 ListNode node2 = new ListNode(3); 51 ListNode node3 = new ListNode(3); 52 ListNode node4 = new ListNode(3); 53 head.next = node2; 54 node2.next = node3; 55 node3.next = node4; 56 splitList split =new splitList(); 57 ListNode returnHead=split.partition(head,3); 58 while (returnHead != null) 59 { 60 System.out.println(returnHead.val ); 61 returnHead = returnHead.next; 62 } 63 System.out.println(); 64 } 65 }

鏈表分割——牛客劍指offer