• 剑指:链表中倒数第k个节点


    题目描述

    输入一个链表,输出该链表中倒数第k个结点。

    解法

    pre 指针走 k-1 步。之后 cur 指针指向 phead,然后两个指针同时走,直至 pre 指针到达尾结点。

    即cur与pre始终相距k-1

    当用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度快一些。

    此题需要考虑一些特殊情况。比如 k 的值小于 0 或者大于链表长度。

    package demo;
    
    public class Solution {
        
        public static class ListNode{
            int val;
            ListNode next = null;
            
            ListNode(int val){
                this.val = val;
            }
        }
        
        public static ListNode findKthtoTail(ListNode head, int k){
            if(head == null || k<1){
                return null;
            }
            ListNode pre = head;
            for(int i=0; i<k-1;i++){//先将pre指针移到第k-1位
                if(pre.next != null)
                    pre = pre.next;
                else
                    return null;
            }
            
            ListNode cur = head;
            while(pre.next != null){//遍历
                pre = pre.next;
                cur = cur.next;
            }
            return cur;
        }
    
        public static void main(String[] args) {
            ListNode head = new ListNode(0);
            
            ListNode node1 = new ListNode(1); head.next = node1;
            ListNode node2 = new ListNode(2); node1.next = node2;
            ListNode node3 = new ListNode(3); node2.next = node3;
            ListNode node4 = new ListNode(4); node3.next = node4;
            ListNode node5 = new ListNode(5); node4.next = node5;
            ListNode node6 = new ListNode(6); node5.next = node6;
            ListNode node7 = new ListNode(7); node6.next = node7;
            ListNode node8 = new ListNode(8); node7.next = node8;
            ListNode node9 = new ListNode(9); node8.next = node9;
            ListNode node10 = new ListNode(10); node9.next = node10;
            
            ListNode cur = head;
            while(cur.next != null){
                cur = cur.next;
                System.out.print(cur.val + " ");
            }
            
            int k = 4;
            ListNode resNode = findKthtoTail(head, k);
            System.out.println("
    链表倒数第"+k+"个元素为:" + resNode.val);
    
        }
    }

    只要从头走n-k+1步即可。

  • 相关阅读:
    未分类[selenium]常见元素定位
    未分类[selenium]-元素定位不到的原因及解决办法
    1.4测试需求分析
    1.3测试用例设计方法
    1.2软件生命周期&测试流程
    《Python 高级编程》简要读书笔记
    app基本测试要点总结
    python 找出两个列表的相同元素与不同元素
    mysql 8.0之后关于group by 语句报错问题
    selenium webdriver 执行原理
  • 原文地址:https://www.cnblogs.com/lisen10/p/11104558.html
Copyright © 2020-2023  润新知