给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
用两个节点fast和slow,先让fast走n步,然后slow和fast一起走,等fast走到最后一个节点时,slow所在位置就是要删除的前一个节点。其他注意的就是抠边界了。
/**
* 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) {
ListNode fast = head,slow = head; while(n > 0){
n--;
fast = fast.next;
}
while(fast!=null && fast.next!=null){
fast = fast.next;
slow = slow.next;
}
if(fast == null){//fast为空有两种情形1.[1] n = 1 2.[1,2,3,4] n = 4分别对应下面的else 和 if
if(head != null && head.next!=null){
head = head.next;
return head;
}else{
head = null;
return head;
} }
fast = slow.next;
slow.next = fast.next;
return head;
}
}
2019-04-17 21:59:17
双指针python版本
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
q1 = ListNode(-1)
q2 = ListNode(-1)
q1=head
q2=head
i = n
while i>0:
q1=q1.next
i-=1
if n==1 and q1==None: #只有一个节点的情况
return q1
elif q1==None:#删除第一个节点的情况
return head.next
while q1.next!=None: #其他情况
q1 = q1.next
q2 = q2.next
q2.next =q2.next.next
return head
2019-11-30 09:18:02
递归版:
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
def help(node):
if not node:
return 0
i = help(node.next)+1
if i>n:
node.next.val=node.val
return i
help(head)
return head.next