zoukankan      html  css  js  c++  java
  • 13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

    转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4255403.html 

    声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

    题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

    题目分析:

      1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一个节点,r.next=null。

      2.创建一个带头节点的单链表,first指向头节点。

      3.单链表的长度假设为N, n=N-1,则正向单链表的下标为[0,n],倒数第k个节点实际上是正数第n-k个节点。

      4.开始只知道单链表的头指针,因此需要遍历两次单链表:第一次求出单链表的长度,并找到尾节点;第二次找到正数第n-k个节点(即为倒数第k个节点)。

      

    节点的数据结构:

     1 //创建一个泛型节点类
     2 class Node<E> {
     3     public E data;
     4     public Node next;
     5     public Node(E data, Node next) {
     6         super();
     7         this.data = data;
     8         this.next = next;
     9     }
    10 }

    注意:这个节点的市局类型是泛型的,以后可以传入任何类型的数据以保证代码的通用性,此处实现的时候,传入的是Integer类型的数据。

    java具体实现:

     1 package com.interview;
     2 
     3 import java.util.Random;
     4 /**
     5  * 题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
     6  * @author wjh
     7  * @param <E>
     8  *
     9  */
    10 public class _13KListNode<E> {
    11 
    12     /**
    13      * @param args
    14      */
    15     public static void main(String[] args) {
    16         _13KListNode knode = new _13KListNode();
    17         Integer[] a = {23,56,11,88,67,46,20,42,17,98,58,33,19};//构造数据源
    18         int k = 5;  //k的范围[0,a.length-1] ,此处略去了审查
    19         knode.printResult(knode,a,k);
    20     }
    21 
    22     //打印结果 
    23     private void printResult(_13KListNode knode,E[] e,int k){        
    24         //1)创建一个除头节点外有num个节点的单链表,
    25         int length = e.length;        
    26         Node first = knode.createList(e);  
    27         Node q = knode.KNode(first, k);   //2)找到倒数第k个节点
    28         System.out.println("这是单链表:");
    29         for(int i=0;i<length-1;i++){
    30             System.out.print(first.next.data+"-->");
    31             first =first.next;
    32         }
    33         System.out.print(first.next.data);
    34         System.out.println("
    这是单链表的倒数第"+k+"个元素:"+q.data);
    35     }
    36     
    37     //输出该链表中倒数第k个结点
    38     private Node  KNode(Node first, int k){
    39         int n = -1;   //n保存节点的个数,从正向计数,节点下标为[0,n],即总共有n+1个真正节点
    40         Node r = first;
    41         while(r.next!=null){  //创建一个循环单链表,尾指针指向first.next
    42             r = r.next;
    43             n++;
    44         }
    45         Node q = first;//q指向倒数第k个节点,倒数第k个节点即为正数第n-k个节点
    46         int t=n-k;
    47         while(t>=0){
    48             q = q.next;
    49             t--;
    50         }
    51         return q;
    52     }
    53     
    54     //创建带头节点的无环单链表,真正的节点有m个
    55     public Node createList(E[] keys){
    56         Node first = new Node(null,null);    //头节点
    57         Node r = first;   //指向链表的尾节点
    58         Random rand = new Random();
    59         for(E e: keys){  //产生0~100之间数字
    60             Node node = new Node(e,null);
    61             r.next = node;
    62             r = node;
    63         }
    64         r.next = null;       //若是构建无环单链表,此处   r.next = null;
    65         return first;
    66     }    
    67 }
    68 
    69 //创建一个泛型节点类
    70 class Node<E> {
    71     public E data;
    72     public Node next;
    73     public Node(E data, Node next) {
    74         super();
    75         this.data = data;
    76         this.next = next;
    77     }
    78 }
    完整源码

    运行结果:

    这是单链表:
    23-->56-->11-->88-->67-->46-->20-->42-->17-->98-->58-->33-->19
    这是单链表的倒数第5个元素:42

  • 相关阅读:
    程序猿身边有个漂亮女程序媛~~~那是种什么样的体验?
    前端程序猿分九段,一段又一段,你是哪一段?
    10个屌炸天的设计网址导航带你嗨翻科技设计界 #精选前端开发设计素材
    人工智能一定高大上?盘点那些让人哭笑不得的人工智障 #精选黑科技人工智能
    javascript奇技淫巧之位运算符
    曾经的超级明星类库jQuery未来也许不再会被前端程序猿追捧了!
    谷歌为什么把上十亿行代码都放在一个仓库里
    全功能响应式模板:黑暗元素
    程序员的福音,AI可以自动修复bug了!
    机器学习原来如此有趣:如何故意欺骗神经网络
  • 原文地址:https://www.cnblogs.com/wuzetiandaren/p/4255403.html
Copyright © 2011-2022 走看看