(leetcode刷题)
删除链表的倒数第N个节点
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例: 给定一个链表: 1->2->3->4->5
, 和 n = 2
.
当删除了倒数第二个节点后,链表变为 1->2->3->5
.
方法一:两次遍历
- 第一遍算出长度,第二遍找到节点并删除。时间复杂度为O(L)
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
delhead=head
newhead=delhead
lens=0
while head:
head=head.next
lens+=1
ind=lens-n-1
if lens==1:
return None
if ind==-1:
return newhead.next
for i in range(lens-1):
if i == ind:
delhead.next=delhead.next.next
else:
delhead=delhead.next
return newhead
方法二:一次遍历,双指针
- 快指针比慢指针快n个,当快指针到达尾端时,慢指针删除该节点。代码更简洁。
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
fast=slow=head
for i 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