题目
Given the head
of a linked list, remove the nth
node from the end of the list and return its head.
Follow up: Could you do this in one pass?
Example 1:
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1 Output: []
Example 3:
Input: head = [1,2], n = 1 Output: [1]
Constraints:
- The number of nodes in the list is
sz
. 1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解答
方法一:
只遍历一遍,方法比较巧妙,相当于设置了两个指针,中间的差为n。
当快的指针到达最后一个时,只需把慢的指针.next设为.next.next即可了。
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;
}
如下解法也是一样的思路
class Solution:
def removeNthFromEnd(self, head, n):
fast = slow = head
for _ in range(n):
fast = fast.next
if not fast:
return head.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return head
方法二:
递归,在最后n个节点不做处理,前面的节点值往后挪。最后删掉head
class Solution:
def removeNthFromEnd(self, head, n):
def index(node):
if not node:
return 0
i = index(node.next) + 1
if i > n:
node.next.val = node.val
return i
index(head)
return head.next
方法三:
递归,删掉第n个节点
class Solution:
def removeNthFromEnd(self, head, n):
def remove(head):
if not head:
return 0, head
i, head.next = remove(head.next)
return i+1, (head, head.next)[i+1 == n]
return remove(head)[1]
方法四:
我自己采用的方法,先遍历一遍找出长度,再数着应该到第几个删除
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
i=1
index=head
#数链表有多少个元素
while(index.next is not None):
i+=1
index=index.next
if (i==1):
return None
#相减得到要去掉的元素的正向排序是多少
num=i-n
if (num==0):
return head.next
#去掉要去的元素
index=head
while(num>1):
index=index.next
num-=1
index.next=index.next.next
return head