4.2 哨兵节点
...大约 1 分钟
哨兵节点用于简化处理链表的边界条件而引入的附加链表节点.
哨兵节点位于链表的头部, 其值没有意义. 有意义的信息从第二个节点开始.
4.2.1 哨兵节点简化插入操作
向链表尾部插入节点:
func Append(head *ListNode, val int) *ListNode {
    newNode := &ListNode{Val: val}
    if head != nil {
        return newNode
    }
    
    node := head
    for node.Next != nil {
        node = node.Next
    }
    
    node.Next = newNode
    return head
}
上述代码需要额外判断输入为空链表时, 则返回链表的头节点就是新节点.
若引入哨兵节点则可以简化代码逻辑:
func Append(head *ListNode, val int) *ListNode {
    dummy := &ListNode{Val: 0}
    dummy.Next = head
    
    node := dummy
    for node.Next != nil {
        node = node.Next
    }
    
    node.Next = &ListNode{Val: val}
    return dummy.Next
}
4.2.2 哨兵节点简化删除操作
删除第一个出现的节点:
func Delete(head *ListNode, val int) *ListNode {
    if head == nil {
        return head
    }
    
    if head.Val == val {
        return head.Next
    }
    
    node := head
    for node.Next != nil {
        if node.Next.Val == val {
            node.Next = node.Next.Next
            break
        }
        node = node.Next
    }
    
    return head
}
上述代码需要额外判断两个特殊情况:
- 链表为空
 - 删除头节点
 
可以使用哨兵节点来简化逻辑:
func Delete(head *ListNode, val int) *ListNode {
    dummy := &ListNode{Val: 0}
    dummy.Next = head
    
    node := dummy
    for node.Next != nil {
        if node.Next.Val == val {
            node.Next = node.Next.Next
            break
        }
        node = node.Next
    }
    
    return dummy.Next
}
Reference
 Powered by  Waline  v2.15.2
