LeetCode

19. 删除链表的倒数第N个结点

给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

思路:
快慢指针,快指针先走 n 个结点,然后慢指针和快指针一起走,直到快指针的下一个结点为 null,此时慢指针的下一个结点就为要删除的结点。注意要删除结点为头结点的情况。

执行用时:1 ms, 在所有 Java 提交中击败了26.22%的用户。(待优化)

  1. class Solution {
  2. public ListNode removeNthFromEnd(ListNode head, int n) {
  3. if (head.next == null) return null;
  4. ListNode fast = head, slow = head;
  5. for (int i = 0; i < n; i++) {
  6. fast = fast.next;
  7. }
  8. if (fast == null) return head.next;
  9. while (fast.next != null) {
  10. fast = fast.next;
  11. slow = slow.next;
  12. }
  13. slow.next = slow.next.next;
  14. return head;
  15. }
  16. }

练习:

61. 旋转链表

143. 重排链表

234. 回文链表

876. 链表的中间结点

剑指 Offer

剑指 Offer 22. 链表中倒数第k个节点

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

思路:
链表,快慢指针。

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode getKthFromEnd(ListNode head, int k) {
  11. ListNode fast = head, slow = head;
  12. for (int i = 0; i < k; i++) {
  13. if(fast == null) return null;
  14. fast = fast.next;
  15. }
  16. while (fast != null) {
  17. fast = fast.next;
  18. slow = slow.next;
  19. }
  20. return slow;
  21. }
  22. }