
题目:
要求是一趟遍历
开始我就想到了,使用递归的 回退 计数法,这个虽然思路很好,但不稳定
递归:
执行用时 : 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗 : 34.7 MB , 在所有 Java 提交中击败了 87.08% 的用户
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {return removeNode(head,n)==n?head.next:head;}public int removeNode(ListNode node,int n) {if(node.next == null) return 1;int m = removeNode(node.next, n);if(m == n)if(m == 1) node.next = null;else node.next = node.next.next;return m+1;}}
看了评论中网友,大多数是用,双指针法 也叫 快慢指针法,性能不错,稳定性好,毕竟是一个方法内 也是一次遍历
快慢指针法:
执行用时 : 0 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗 : 34.2 MB , 在所有 Java 提交中击败了 89.02% 的用户
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode fast = head;ListNode slow = head;for (int i = 1; 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;}}
