【剑指offer】19. 链表中倒数最后k个结点(java)
发布人:shili8
发布时间:2024-11-19 07:15
阅读次数:0
**剑指Offer19: 链表中倒数最后 k 个结点**
### 题目描述给定一个链表的头节点 head 和一个整数 k,返回链表中倒数第 k 个结点。
### 解决方案#### 方法一:使用栈实现我们可以使用栈来存储链表中的结点。然后,从栈顶开始取出 k 个结点,这些结点就是我们要找的倒数最后 k 个结点。
javapublic class Solution { public ListNode getKthNode(ListNode head, int k) { // 使用栈实现 Stackstack = new Stack<>(); // 将链表中的结点压入栈中 while (head != null) { stack.push(head); head = head.next; } // 从栈顶开始取出 k 个结点 for (int i =0; i < k -1; i++) { stack.pop(); } // 返回链表中倒数第 k 个结点 return stack.isEmpty() ? null : stack.pop(); } }
#### 方法二:使用双指针实现我们可以使用两个指针,一个从链表头开始向后移动,另一个从链表尾开始向前移动。两个指针之间的距离为 k 个结点。
javapublic class Solution { public ListNode getKthNode(ListNode head, int k) { // 使用双指针实现 ListNode p1 = head; ListNode p2 = head; // 将 p2 移动到链表尾部 while (p2.next != null) { p2 = p2.next; } // 将 p1 和 p2 之间的距离为 k 个结点 for (int i =0; i < k -1; i++) { p1 = p1.next; p2 = p2.prev; } // 返回链表中倒数第 k 个结点 return p1; } }
#### 方法三:使用递归实现我们可以使用递归来找到链表中的倒数第 k 个结点。
javapublic class Solution { public ListNode getKthNode(ListNode head, int k) { // 使用递归实现 if (head == null || k <=0) { return null; } // 递归找到链表中的倒数第 k 个结点 ListNode node = getKthNode(head.next, k -1); // 如果 k 为1,则返回当前结点 if (k ==1) { return head; } else { // 否则,继续递归 return node; } } }
### 总结以上是链表中倒数最后 k 个结点的三种解决方案。每种方法都有其优缺点和使用场景。选择哪种方法取决于具体问题的需求和限制。
###代码注释* 使用栈实现:该方法使用栈来存储链表中的结点,然后从栈顶开始取出 k 个结点。
* 使用双指针实现:该方法使用两个指针,一个从链表头开始向后移动,另一个从链表尾开始向前移动。两个指针之间的距离为 k 个结点。
* 使用递归实现:该方法使用递归来找到链表中的倒数第 k 个结点。
###代码示例以下是链表中倒数最后 k 个结点的代码示例:
javapublic class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } public class Solution { public ListNode getKthNode(ListNode head, int k) { // 使用栈实现 Stackstack = new Stack<>(); while (head != null) { stack.push(head); head = head.next; } for (int i =0; i < k -1; i++) { stack.pop(); } return stack.isEmpty() ? null : stack.pop(); } public static void main(String[] args) { ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(4); head.next.next.next.next = new ListNode(5); Solution solution = new Solution(); ListNode kthNode = solution.getKthNode(head,3); System.out.println(kthNode.val); // 输出:3 } }
以上是链表中倒数最后 k 个结点的代码示例。