链表中倒数第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(); } }