题目:
解题思路:
用虚拟头结点,规避头结点的删除与后续结点擅长逻辑不一样的问题。
解题的时候可以画个图,要删除的是cur.next对应的值(因为要知道cur,才能知道cur.next),所以可以让cur=cur.next.next
调试过程:
原因:等于应该是“==”,不等于应该是"!="
修改后,死循环了:
# 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
`始终为真。
又错了:
原因:假如给定链表[7],val=7。则cur.next,val=7,但是cur.next.next不存在。
所以while判断条件应该是 cur.next != None
错误:
原因:根本没删。
问题出在这儿: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