• 剑指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 }
  • 相关阅读:
    algorithm 使用经验
    Overload, Override and Overwrite ( copy)
    stl sort使用经验
    list 删除制定元素
    php常用技巧
    php 日历源码
    stl smart指针
    一道华为笔试题 ,内存相关
    stl list使用。(转)
    List 使用经验
  • 原文地址:https://www.cnblogs.com/noaman/p/5407766.html
Copyright © 2020-2023  润新知