【力扣刷题】19. 删除链表的倒数第 N 个结点

题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]

解法一:(计算链表长度)

解题思路:

在头结点前设置一个哑结点dummy,并指向head头结点。

哑结点的好处就是不需要考虑特例,不用担心head当前节点是不是为空,当前head节点会不会被删除。

首先遍历一遍链表,并计数,看共有多少个元素,计数共k个。

重新将head放回哑结点处,一步步往后移动k-n-1步,此时head位于第k-n-1个元素位置上,现在就要将head.nexy指向head.next.next,以此删除这个节点。最后返回dummy.next

dummy=ListNode(0,head)
cur=dummy
k=0
while(cur.next):
     cur=cur.next
     k+=1
cur=dummy
for i in range(k-n):
    cur=cur.next
cur.next=cur.next.next
return dummy.next

解法二:(栈)

解题思路:同样需要遍历链表计算长度,还会另外消耗内存保存元素

在头结点前设置一个哑结点dummy,并指向head头结点。设置空列表stack=list().

第一步,放cur到哑结点处,遍历一遍链表,并计数,看共有多少个元素,同时将每个元素添加进列表stack中,计数共k个。

第二步,从列表尾部依次删除n个元素,此时刚好把需要删除的节点删除了,此时将设置p放在列表最后一个元素,同时设置p.next指向p.next.next。最后返回dummy.next。

#栈
dummy = ListNode(0, head)
stack = list()
cur = dummy
while cur:
    stack.append(cur)  #从头结点前面增加的元素开始放进列表,就不需要单独考虑第一个元素
    cur=cur.next
for i in range(n):
    stack.pop()  #从列表尾部一个个删除元素
p = stack[-1]
p.next =p.next.next
return dummy.next

知识点:

知识1:dummy=ListNode(0,head)

表示在head头结点前再设置一个节点,同时下一个元素指向head头结点。

优点:一定要记住,在头结点前面添加元素,就不用考虑第一个元素是否为空,第一个元素会不会被删除的情况,同时可以抵消python中以0开端的情况,计数更清晰。

知识2:建立空列表、空链表

a=[] ,b=list() #都能建立空列表,同时list也是关键字

stack=ListNode()

知识3:pop()函数

list.pop()表示默认删除最后一个元素,如果给参数list.pop(1),表示删除从前面的第二个元素。

知识4:将列表中的某一个值(这个值同时也在链表中)赋值给某个变量,通过这个变量也可以指针指回链表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值