代码随想录算法训练营 | 第三天 | 博客打卡
题目链接:leetcode 203 移除链表元素
注:仅为个人笔记,难以细致且通俗。
func removeElements(head *ListNode, val int) *ListNode {
newHead := &ListNode{}
newHead.Next = head
cur := newHead
for cur != nil && cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return newHead.Next
}
newHead
是干什么的?初学肯定是有点懵。因为删除的逻辑是,判断当前结点的下一个结点值是否为目标值,即语句 if cur.Next.Val == val { }
。为了让表头 head
也能用上这个逻辑,所以要给 head
设一个前结点。
而为什么一定要判断下一个结点的值,删下一个值?却不是直接判断当前值?由于链表特殊,和数组不一样,你的观察当前结点的时候,上一个结点就丢了。
func removeElements(head *ListNode, val int) *ListNode {
newHead := &ListNode{}
newHead.Next = head
cur := newHead
for cur != nil && cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return newHead.Next
}
有些人不明白 cur != nil
是干什么的,换一个啰嗦的写法你是不是就懂了呢?
func removeElements(head *ListNode, val int) *ListNode {
if head == nil {
return nil
}
newHead := &ListNode{}
newHead.Next = head
cur := newHead
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return newHead.Next
}