zoukankan      html  css  js  c++  java
  • 剑指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 }
  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/noaman/p/5407766.html
Copyright © 2011-2022 走看看