力扣热题100之删除链表的倒数第N个节点
题目
给你一个链表,删除链表的倒数第 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.nexthead_list.pop(-n)if not head_list:return Noneres=ListNode(head_list[0])cur=resfor num in head_list[1:]:cur_node=ListNode(num)cur.next=cur_nodecur=cur.nextreturn 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=0while head:length+=1head=head.nextreturn lengthdummy= ListNode(0,head)#在head头节点前面添加一个值为0的节点length=getlength(head)cur=dummyfor i in range(1,length-n+1):cur =cur.nextcur.next=cur.next.nextreturn 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=dummywhile cur:stack.append(cur)cur = cur.nextfor i in range(n):stack.pop()prev=stack[-1]#就是为了找到被删除节点的前驱节点prev.next=prev.next.nextreturn dummy.next