標籤:
【題目】輸入一個鏈表,輸出該鏈表中倒數第k個結點。
【思路】方法3:設定兩個指標,第一個指標先走k-1步,第2個指標開始走,(這時候第一個指標指向第k個)當第一個指標走到尾部時(即走了k步),第一個指標即指向第k個結點。(推薦的方法)
方法2:先擷取結點個數,再順數第n-k+1個結點 1 2 3 4 5 6
方法1:先擷取長度,再複製至數組一中,再反序加至數組2中,這時候要輸出倒數第K個數即為數組2中的順數第k-1個數。此處出現的異常不知道該怎麼處理。(我的方法)
1 package com.exe3.offer; 2 3 /** 4 * 【題目】輸入一個鏈表,輸出該鏈表中倒數第k個結點。 5 * @author WGS 6 * 7 */ 8 public class PrinkLinkNode { 9 static class LinkNode{ 10 int val; 11 LinkNode next=null; 12 public LinkNode(int n){ 13 this.val=n; 14 } 15 } 16 //方法3:設定兩個指標,第一個指標先走k-1步,第2個指標開始走,(這時候第一個指標指向第k個)當第一個指標走到尾部時(即走了k步),第一個指標即指向第k個結點。 17 public LinkNode printLinkNodeFromTail3(LinkNode node,int k){ 18 //異常處理,若頭指標node為空白或者輸入的k結點是0 19 if(node==null||k<=0){ 20 21 System.out.println("invalid"); 22 return null; 23 } 24 LinkNode firstIndex=node;//此處要注意,亮點 25 LinkNode secondIndex=null; 26 for(int i=0;i<k-1;i++){ 27 if(firstIndex!=null){ 28 firstIndex=firstIndex.next; 29 }else{ 30 return null; 31 } 32 } 33 //此時第一個指標已經走至第k步 34 secondIndex=node; 35 while(firstIndex.next!=null){ 36 firstIndex=firstIndex.next; 37 secondIndex=secondIndex.next; 38 } 39 40 return secondIndex; 41 42 } 43 //方法2:先擷取結點個數,再順數第n-k+1個結點 1 2 3 4 5 6 44 public LinkNode printLinkNodeFromTail2(LinkNode node,int k){ 45 LinkNode temp=node; 46 int lenOfNode=0; 47 if(node==null||k<=0){ 48 49 System.out.println("invalid"); 50 return null; 51 } 52 //1 擷取長度 53 while(node!=null){ 54 lenOfNode++;//結點個數 55 node=node.next; 56 } 57 int i=1; 58 //2 順數直至第n-k+1個點 59 while(k<=lenOfNode &&(i!=lenOfNode-k+1)){ 60 i++; 61 temp=temp.next; 62 } 63 //合理 64 if(k<=lenOfNode){ 65 return temp; 66 } 67 return null; 68 69 } 70 //方法1:先擷取長度,再複製至數組一中,再反序加至數組2中,這時候要輸出倒數第K個數即為數組2中的順數第k-1個數。此處出現的異常不知道該怎麼處理。 71 public int printLinkNodeFromTail(LinkNode node,int k){ 72 LinkNode temp=node; 73 int len=0; 74 int m=0; 75 //1 擷取長度 76 while(node!=null){ 77 len++; 78 node=node.next; 79 } 80 if(temp==null||k<0||k>=len){ 81 try { 82 System.out.println("invalid"); 83 } catch (Exception e) { 84 // TODO Auto-generated catch block 85 e.printStackTrace(); 86 } 87 } 88 int[] arr1=new int[len]; 89 while(temp!=null){ 90 arr1[m++]=temp.val; 91 temp=temp.next; 92 } 93 int[] arr2=new int[len]; 94 for(int i=0;i<arr1.length;i++){ 95 arr2[len-1-i]=arr1[i]; 96 } 97 if(k<=len){ 98 return arr2[k-1]; 99 }100 return 0;101 102 103 }104 public static void main(String[] args){105 PrinkLinkNode p=new PrinkLinkNode();106 LinkNode node1=new LinkNode(1);107 LinkNode node2=new LinkNode(2);108 LinkNode node3=new LinkNode(3);109 LinkNode node4=new LinkNode(4);110 LinkNode node5=new LinkNode(5);111 LinkNode node6=new LinkNode(6);112 node1.next=node2;113 node2.next=node3;114 node3.next=node4;115 node4.next=node5;116 node5.next=node6;117 //3118 /*int n=p.printLinkNodeFromTail(node1,8);119 System.out.println(n);*/120 //2121 /*LinkNode node=p.printLinkNodeFromTail2(node1,0);122 if(node!=null){123 System.out.println(node.val);124 }else{125 System.out.println("null");126 }*/127 //3128 LinkNode node=p.printLinkNodeFromTail3(node1,0);129 if(node!=null){130 System.out.println(node.val);131 }else{132 System.out.println("null");133 }134 135 }136 137 138 139 140 141 142 143 }
劍指offer系列12---鏈表倒數第k個結點