2.1移除链表元素(LC203-E)

题目:

解题思路:

用虚拟头结点,规避头结点的删除与后续结点擅长逻辑不一样的问题。

解题的时候可以画个图,要删除的是cur.next对应的值(因为要知道cur,才能知道cur.next),所以可以让cur=cur.next.next

110dc5cda86b4130a36876eb8b04d15c.jpg

调试过程:

bc570108047341c0acb297f2fab97124.png

91b8202f18e34fee80d6bcbd19ef10b3.png

原因:等于应该是“==”,不等于应该是"!="

修改后,死循环了:

# Definition for singly-linked list.
#定义节点,存放data和指针
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        #定义一个虚拟头节点
        dummyhead = ListNode(next = head)
        while dummyhead.next != None:
            cur = dummyhead
            if cur.next == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummyhead.next

原因:

在每次循环迭代时,您都将`cur`设置为`dummyhead`,然后检查`cur.next`是否等于`val`。如果相等,您将跳过当前节点,并将`cur.next`指向下一个节点。否则,您将将`cur`更新为`cur.next`

然而,即使在跳过当前节点后,您没有更新`dummyhead``next`属性,因此`dummyhead.next`仍然指向原始链表中的同一个节点。这导致了一个无限循环,因为循环条件`dummyhead.next != None`始终为真。

又错了:

df5fa6dec570461c969e3f93933da6b6.png6612430483794151a0d5cb62c9f7dfdb.png

原因:假如给定链表[7],val=7。则cur.next,val=7,但是cur.next.next不存在。

所以while判断条件应该是 cur.next != None

错误:

d275b9d0b2aa4624beaf34cbe332db38.pnga7fd54c5badf437795aa864716e687bc.png

原因:根本没删。

问题出在这儿:if cur.next == val: cur.next是一个指针,而val是data,指针不能等于data,应该是指针对应的data与val相等。if cur.next.val== val:

正确代码:

# Definition for singly-linked list.
#定义节点,存放data和指针
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:       
        #定义一个虚拟头节点
        dummyhead = ListNode(next = head)
        cur = dummyhead
        while cur.next != None:            
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummyhead.next

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值