• 剑指 Offer 22. 链表中倒数第k个节点


    原题链接

    题解

    方式一:

    最容易想到的是先遍历一遍链表求出链表的长度len, 倒数第k个节点(题目中说下表从1开始)就是顺序的len - k + 1个节点,然后再遍历一遍找到答案就行。
    在本题中数据中的k好像没有超出链表长度的范围,所以不用判定就行了。如果题目中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) {
            int res = 0;
            ListNode p = head;
            while(p != null){
                res ++;
                p = p.next;
            }
            int t = res - k;
            while((t --) != 0){
                head = head.next;
            }
    
            return head;
        }
    }
    

    方式二

    可以使用双指针的方式,定义一个指向链表头指针p,先让p走k步,那么剩下p到链表的最后还有len - k步,刚好是head走len - k步就可以到达len - k + 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) {
            ListNode p = head;
            while((k --) != 0){
                p = p.next;
            }
    
            while(p != null){
                head = head.next;
                p = p.next;
            }
    
            return head;
        }
    }
    
    如有错误,欢迎指正!
  • 相关阅读:
    随笔
    json对象的默认排序问题
    SQl死锁随想
    疑惑
    .netportal
    WCF中出现方法出现无法匹配的异常
    自动播放图片,可以调整速度。
    一个二级树形菜单,初始显示为全部展开,适用于分类较少的情况。
    整理了一下以后需要用的软件
    缩略图,大图,同页显示
  • 原文地址:https://www.cnblogs.com/Lngstart/p/14758267.html
Copyright © 2020-2023  润新知