标签:
【题目】输入一个链表,输出该链表中倒数第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 //3 118 /*int n=p.printLinkNodeFromTail(node1,8); 119 System.out.println(n);*/ 120 //2 121 /*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 //3 128 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 }
标签:
原文地址:http://www.cnblogs.com/noaman/p/5407766.html