题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
代码
方法一
将链表中的值放入列表中,然后删除倒数第n个值,再将剩下的数依次转化为链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
head_list=[]
while head:
head_list.append(head.val)
head=head.next
head_list.pop(-n)
if not head_list:
return None
res=ListNode(head_list[0])
cur=res
for num in head_list[1:]:
cur_node=ListNode(num)
cur.next=cur_node
cur=cur.next
return res
方法二:
将构造一个新链表,计算链表长度通过遍历找到需要删除的节点的前驱节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
def getlength(head:ListNode)->int:
length=0
while head:
length+=1
head=head.next
return length
dummy= ListNode(0,head)#在head头节点前面添加一个值为0的节点
length=getlength(head)
cur=dummy
for i in range(1,length-n+1):
cur =cur.next
cur.next=cur.next.next
return dummy.next
方法三:
使用栈的思想找到需要删除的节点的前驱节点,然后使用和方法二相同的方法实现删除节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy= ListNode(0,head)#在head头节点前面添加一个值为0的节点
stack=[]
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