leetcode 19. Remove Nth Node From End of List

xiaoxiao2021-02-28  105

Given a linked list, remove the nth node from the end of list and return its head.

For example,

Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.

Note: Given n will always be valid. Try to do this in one pass.

采用递归的方法实现one pass

public class Solution { int cnt=0, target=0; public ListNode removeNthFromEnd(ListNode head, int n) { target = n; return removeNthFromEnd(head); } private ListNode removeNthFromEnd(ListNode head){ if(head==null){ cnt++; return null; } head.next = removeNthFromEnd(head.next); return cnt++==target? head.next : head; } } 利用两个指针实现的方法

A one pass solution can be done using pointers. Move one pointer fast --> n+1 places forward, to maintain a gap of n between the two pointers and then move both at the same speed. Finally, when the fast pointer reaches the end, the slow pointer will be n+1 places behind - just the right spot for it to be able to skip the next node.

Since the question gives that n is valid, not too many checks have to be put in place. Otherwise, this would be necessary.

public ListNode removeNthFromEnd(ListNode head, int n) { ListNode start = new ListNode(0); ListNode slow = start, fast = start; slow.next = head; //Move fast in front so that the gap between slow and fast becomes n for(int i=1; i<=n+1; i++) { fast = fast.next; } //Move fast to the end, maintaining the gap while(fast != null) { slow = slow.next; fast = fast.next; } //Skip the desired node slow.next = slow.next.next; return start.next; }

转载请注明原文地址: https://www.6miu.com/read-22693.html

最新回复(0)