【剑指offer】-链表中倒数第K个结点-14/67

简介: 【剑指offer】-链表中倒数第K个结点-14/67

1. 题目描述

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

假设题目为: 3 【1,2,3,4,5,6】

2. 题目思路

2.1 第一种思路:两个结点分别跑

1 判断当前给的链表head是不是null,如果是的话,返回null

2. 判断k的值,如果k的值,小于等于0,返回null

3. 建立两个结点,指向head(注意:这里一定要明白当前链表是不是有头结点的,该题不含有头结点)

4. 先让p1结点跑k-1(2)次(要时刻注意,p1.next是否走到了null)

5. 然后p1和p2同时开始跑,等到p1.next跑到null时,p2所指的指针就是倒数第K(3)个结点

2.2 第二种思路:一个结点跑

1 判断当前给的链表head是不是null,如果是的话,返回null

2. 判断k的值,如果k的值,小于等于0,返回null

3. 建立一个结点,遍历一遍链表,找到链表的长度len

4. 重新定义结点p1,此时,num = (len - k + 1)就是链表在结点中的位置,位置必须大于0

5. 此时链表p1指向第一个数值。所以,只需要跑num - 1次,即可找到倒数第K个数

3. 题目代码

3.1 第一种思路:两个结点分别跑

public ListNode FindKthToTail(ListNode head,int k) {
           if(head == null || k <= 0){
               return null;
           }
            ListNode p1 = head;
            ListNode p2 = head;
            for(int i = 0; i < k - 1; i++){
                if(p1.next == null){
                    return null;
                }else{
                    p1 = p1.next;
                } 
            }
        while(p1.next != null){
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }

3.2 第二种思路:一个结点跑

public ListNode FindKthToTail(ListNode head, int k) {
    if (head == null || k <= 0) {
      return null;
    }
    ListNode p1 = head;
    int len = 0;
    while (p1 != null) {
            p1 = p1.next;
      len++;
    }
    int num = len - k + 1;
        p1 = head;
    if (num <= 0) {
      return null;
    }
    for (int i = 1; i < num; i++) {
      p1 = p1.next;
    }
    return p1;
  }


相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
71 1
|
1月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
20 1
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
61 1