剑指Offer-22

链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

做法1:使用栈

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode result = null;
        while(head != null){
            stack.push(head);
            head = head.next;
        }
        for(int i = 0; i < k; i++){
            result = stack.pop();
        }
        return result;
    }
}

做法2:双指针,前指针先向前走k步,随后前指针和后指针一起向前走,直到前指针为null,此时后指针就是倒数第k个结点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode front = head;
        ListNode behind = head;
        for(int i = 0; i < k; i++){
            front = front.next;
        }
        while(front != null){
            front = front.next;
            behind = behind.next;
        }
        return behind;
    }
}

上一篇:数据结构基础(C语言)———顺序队列


下一篇:WeBASE-Front中间件搭建