Java实现链表中倒数第k个结点

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

链表中倒数第k个结点

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

package last;
import java.util.Stack;
/**
 * @author kegekeqi
 * @version 1.0
 * @date 2022-1-18 7:49
 */
public class KLastNode {
  public static class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
      this.val = val;
    }
  }
  //方法一 利用栈
  public ListNode findKthToTail1(ListNode head, int k) {
    if (null == head || k <= 0) {
      return null;
    }
    int numbOfList = 1;
    Stack<ListNode> st = new Stack<ListNode>();
    st.push(head);
    ListNode node = head.next;
    while (null != node) {
      numbOfList ++;
      st.push(node);
      node = node.next;
    }
    if (k > numbOfList) {
      return null;
    } else {
      for (int i = 1; i <= k; i++) {
        node = st.pop();
      }
      return node;
    }
  }
  //方法2:利用两个相距为k-1的指针
  public ListNode FindKthToTail2(ListNode head, int k) {
    if (head == null || k <= 0) {
      return null;
    }
    ListNode pAhead = head;
    for (int i = 1; i < k; i++) {
      pAhead = pAhead.next;
      if (pAhead == null) {
        return null;
      }
    }
    ListNode pBehind = head;
    while (pAhead.next != null) {
      pAhead = pAhead.next;
      pBehind = pBehind.next;
    }
    return pBehind;
  }
  void test1() {
    ListNode head=null;
    ListNode result=FindKthToTail2(head, 1);
    if (result==null) {
      System.out.println("test1 passed!");
    } else {
      System.out.println("test1 failed!");
    }
  }
  /*
   * k超出范围
   */
  void test2() {
    ListNode head=new ListNode(2);
    ListNode result=FindKthToTail2(head, 2);
    if (result==null) {
      System.out.println("test2 passed!");
    }
    else {
      System.out.println("test2 failed!");
    }
  }
  /*
   * 单个结点
   */
  void test3() {
    ListNode head=new ListNode(1);
    ListNode result=FindKthToTail2(head, 1);
    if(result.val==1) {
      System.out.println("test3 passed!");
    }
    else {
      System.out.println("test3 failed!");
    }
  }
  /*
   * 尾结点
   */
  void test4() {
    ListNode node1=new ListNode(1);
    ListNode node2=new ListNode(2);
    ListNode node3=new ListNode(3);
    ListNode node4=new ListNode(4);
    node1.next=node2;
    node2.next=node3;
    node3.next=node4;
    ListNode result=FindKthToTail2(node1, 1);
    if(result.val==4) {
      System.out.println("test4 passed!");
    }
    else {
      System.out.println("test4 failed!");
    }
  }
  /*
   * 中间结点
   */
  void test5() {
    ListNode node1=new ListNode(1);
    ListNode node2=new ListNode(2);
    ListNode node3=new ListNode(3);
    ListNode node4=new ListNode(4);
    node1.next=node2;
    node2.next=node3;
    node3.next=node4;
    ListNode result=FindKthToTail2(node1, 2);
    if(result.val==3) {
      System.out.println("test5 passed!");
    }
    else {
      System.out.println("test5 failed!");
    }
  }
  /*
   * 头结点
   */
  void test6() {
    ListNode node1=new ListNode(1);
    ListNode node2=new ListNode(2);
    ListNode node3=new ListNode(3);
    ListNode node4=new ListNode(4);
    node1.next=node2;
    node2.next=node3;
    node3.next=node4;
    ListNode result=FindKthToTail2(node1, 4);
    if(result.val==1) {
      System.out.println("test6 passed!");
    }else {
      System.out.println("test6 failed!");
    }
  }
  public static void main(String[] args) {
    KLastNode demo = new KLastNode();
    demo.test1();
    demo.test2();
    demo.test3();
    demo.test4();
    demo.test5();
    demo.test6();
  }
}
相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
79 1
|
1月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
23 1
|
3月前
链表的中间结点
链表的中间结点
183 57
|
3月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
28 3
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
47 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第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 个结点
18 0
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表