剑指offer系列12---链表倒数第k个结点

【题目】输入一个链表,输出该链表中倒数第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 }
原文地址:https://www.cnblogs.com/noaman/p/5407766.html