题目描述:
方法一 我能想到的解法
遍历一次计算链表长度 l,之后再从头结点遍历一次,当遍历到第 l-n+1时,即为需要删除的节点
因为可能n = l ,删除链表头节点,因此为方便删除操作,增加一个节点 p指向链表头节点
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if not head:
return ;
p = head
l = 0 # 链表长度
# 计算链表长度
while p!=None:
l += 1
p = p.next
p = ListNode(0,head)
q = p
for i in range(1,l-n+1):
q = q.next
q.next = q.next.next
return p.next
方法二 快慢指针
使用两个两个指针 fast 、slow,fast先走 n 步,然后fast 、slow一起走,当fast遍历到链表末尾时,slow恰好处于倒数第n个节点
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if not head:
return ;
dummy = ListNode(0,head)
fast,slow = dummy.next,dummy
for i in range(n):
fast = fast.next
while fast:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next