第4天 删除链表第K结点

来源:互联网 发布:算法与数据结构自测题 编辑:程序博客网 时间:2024/05/19 15:43


题目:

输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。
例如一个链表有6个结点,从头结点开始他们的值依次是
1、 2、 3、 4、 5、 6。
这个链表的倒数第3个结点是值为4的结点。


利用递归的堆栈调用顺序


/** *  面试题15 输入一个链表,输出该链表中倒数第K个结点。 *  为了符合大多数人的习惯,本题从1开始计数, *  即链表的尾结点是倒数第1个结点。 *  例如一个链表有6个结点,从头结点开始他们的值依次是 *  1、 2、 3、 4、 5、 6。 *  这个链表的倒数第3个结点是值为4的结点。 *   *  2014-1-18 */public class KthNodeFromEnd <T extends Comparable<? super T>> {class Node<T> {T data;Node<T> next;}private Node<T> mHeade;public boolean addNode(T data) {if (data == null) {throw new NullPointerException();}if (mHeade == null) {mHeade = new Node<T>();mHeade.data = data;} else {Node<T> currentNode = mHeade;while (currentNode.next != null) {currentNode = currentNode.next;}Node<T> newNode = new Node<T>();newNode.data = data;currentNode.next = newNode;}return true;}private int mIndex = 0;public void printIndexKValue(int k) {if (k <= 0) {throw new IllegalArgumentException();}if (mHeade == null) {throw new NullPointerException();}mIndex = 0;printValue(mHeade, k);}private void printValue(Node<T> currentNode, int k) {if (currentNode != null) { // 需要进行控制判断printValue(currentNode.next, k);mIndex++;if (mIndex == k) {System.out.println(currentNode.data);}}}public void output() {Node<T> currentNode = mHeade;while (currentNode != null) {System.out.print(currentNode.data + " ");currentNode = currentNode.next;}System.out.println();}public static void main(String[] args) {KthNodeFromEnd<Integer> kthNodeFromEnd = new KthNodeFromEnd<Integer>();kthNodeFromEnd.addNode(9);kthNodeFromEnd.addNode(100);kthNodeFromEnd.addNode(2);kthNodeFromEnd.addNode(73);kthNodeFromEnd.addNode(82);kthNodeFromEnd.addNode(105);kthNodeFromEnd.addNode(666);kthNodeFromEnd.output();kthNodeFromEnd.printIndexKValue(1);kthNodeFromEnd.printIndexKValue(2);kthNodeFromEnd.printIndexKValue(3);kthNodeFromEnd.printIndexKValue(4);kthNodeFromEnd.printIndexKValue(5);kthNodeFromEnd.printIndexKValue(6);kthNodeFromEnd.printIndexKValue(7);}}



参考资料:

《剑指offer》  面试题15






0 0
原创粉丝点击