LeetCode
19. 删除链表的倒数第N个结点
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
思路:
快慢指针,快指针先走 n 个结点,然后慢指针和快指针一起走,直到快指针的下一个结点为 null,此时慢指针的下一个结点就为要删除的结点。注意要删除结点为头结点的情况。
执行用时:1 ms, 在所有 Java 提交中击败了26.22%的用户。(待优化)
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if (head.next == null) return null;ListNode fast = head, slow = head;for (int i = 0; i < n; i++) {fast = fast.next;}if (fast == null) return head.next;while (fast.next != null) {fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return head;}}
练习:
61. 旋转链表
143. 重排链表
234. 回文链表
876. 链表的中间结点
剑指 Offer
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
思路:
链表,快慢指针。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/class Solution {public ListNode getKthFromEnd(ListNode head, int k) {ListNode fast = head, slow = head;for (int i = 0; i < k; i++) {if(fast == null) return null;fast = fast.next;}while (fast != null) {fast = fast.next;slow = slow.next;}return slow;}}
