题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
方法一
计算链表长度L,然后从头开始对链表进行遍历,当遍历到L-n+1个节点时,找到所要删除的节点。
代码如下:
class Solution:
def fun(self, head:ListNode, n):
def getlength(head:ListNode):
length = 0
while head:
length += 1
head = head.next
return length
dummy = ListNode(0,head)
length = getlength(head)
cur = dummy
for i in range(length - n + 1):
cur = cur.next
cur.next = cur.next.next
return dummy.next
复杂度分析:
时间复杂度:O(L),L链表长度
空间复杂度:O(1)
方法二
采用栈方法,在遍历链表的同时,把所有节点一次入栈。根据先进后出原则,弹出的第n个节点就是要删除的节点。其前驱节点就是栈顶元素。
代码如下:
class Solution:
def fun(self, head:ListNode, n):
dummy = ListNode(0, head)
stack = list()
cur = dummy
while cur:
stack.append(cur)
cur = cur.next
for i in range(n):
stack.pop()
prev = stack[-1]
prev.next = prev.next.next
return dummy.next
时间复杂度:O(L)
空间复杂度:O(L)
方法三
采用双指针方法,让快指针与慢指针,中间隔n个节点,当快指针走到n处时,慢指针开始走,当快指针走到末尾时,慢指针就到了倒数第n个位置。
代码如下:
class Solution:
def fun(self, head:ListNode, n):
dummy = ListNode(0,head)
fast = head
slow = 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
时间复杂度:O(L)
空间复杂度:O(1)