首页 > 代码库 > 13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

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

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.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 =http://www.mamicode.com/ 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 args14      */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("\n这是单链表的倒数第"+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.next42             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 =http://www.mamicode.com/ data;76         this.next = next;77     }78 }
完整源码

 

运行结果:

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

 

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