鏈表分割——牛客劍指offer
阿新 • • 發佈:2018-07-20
之前 排列 頭指針 print lse 遍歷 lis 例如 自建
題目描述:
編寫代碼,以給定值x為基準將鏈表分割成兩部分,所有小於x的結點排在大於或等於x的結點之前
給定一個鏈表的頭指針 ListNode pHead,請返回重新排列後的鏈表的頭指針。註意:分割以後保持原來的數據順序不變。
題目分析:
將鏈表分割為兩部分,以x值為分割線(x不一定存在於鏈表中):前部分鏈表結點的值是小於x的,而且這一部分各結點的順序與在原鏈表中的相對順序相同。後部分鏈表結點的值是大於等於x的,而且這一部分各結點的順序與在原鏈表中的相對順序相同。
例如,鏈表{1,3,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