LeetCode删除链表倒数第n个元素,使用递归计数法 - 图1
题目:
LeetCode删除链表倒数第n个元素,使用递归计数法 - 图2
要求是一趟遍历
开始我就想到了,使用递归的 回退 计数法,这个虽然思路很好,但不稳定

递归:

执行用时 : 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗 : 34.7 MB , 在所有 Java 提交中击败了 87.08% 的用户

  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 removeNthFromEnd(ListNode head, int n) {
  11. return removeNode(head,n)==n?head.next:head;
  12. }
  13. public int removeNode(ListNode node,int n) {
  14. if(node.next == null) return 1;
  15. int m = removeNode(node.next, n);
  16. if(m == n)
  17. if(m == 1) node.next = null;
  18. else node.next = node.next.next;
  19. return m+1;
  20. }
  21. }

看了评论中网友,大多数是用,双指针法 也叫 快慢指针法,性能不错,稳定性好,毕竟是一个方法内 也是一次遍历

快慢指针法:

执行用时 : 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗 : 34.2 MB , 在所有 Java 提交中击败了 89.02% 的用户

  1. class Solution {
  2. public ListNode removeNthFromEnd(ListNode head, int n) {
  3. ListNode fast = head;
  4. ListNode slow = head;
  5. for (int i = 1; i <= n; i++)
  6. fast = fast.next;
  7. if (fast == null)
  8. 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. }