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();
  }
}
相关文章
|
19天前
19 删除链表的倒数第 N 个结点
19 删除链表的倒数第 N 个结点
|
1月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
1月前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
|
2天前
|
存储
三种方法实现获取链表中的倒数第n个元素
三种方法实现获取链表中的倒数第n个元素
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
|
1月前
|
存储 Java
Java链表
Java链表
11 0
|
1月前
LeetCode刷题---876. 链表的中间结点(快慢指针)
LeetCode刷题---876. 链表的中间结点(快慢指针)
|
1月前
|
算法 Java 索引
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
23 0
|
1月前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)
|
1月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】