1. 程式人生 > 實用技巧 >2020-08-07:給定單向連結串列的頭指標和一個要刪除的值,返回刪除後的連結串列的頭節點。

2020-08-07:給定單向連結串列的頭指標和一個要刪除的值,返回刪除後的連結串列的頭節點。

福哥答案2020-08-07:

1.新增虛擬頭,返回head.Next。
2.換頭,返回head。

程式碼用go語言編寫,如下:

package test32_deletenode

import (
    "fmt"
    "testing"
)

//go test -v -test.run TestDeleteNode
func TestDeleteNode(t *testing.T) {
    if true {
        head := &ListNode{}
        head.Val = 1

        head.Next = &ListNode{}
        head.Next.Val = 5

        head.Next.Next = &ListNode{}
        head.Next.Next.Val = 1

        head.Next.Next.Next = &ListNode{}
        head.Next.Next.Next.Val = 9

        headtemp := head
        for headtemp != nil {
            fmt.Print(headtemp.Val, "\t")
            headtemp = headtemp.Next
        }
        fmt.Println("刪除前")
        head = DeleteNode1(head, 1)
        headtemp = head
        for headtemp != nil {
            fmt.Print(headtemp.Val, "\t")
            headtemp = headtemp.Next
        }
        fmt.Println("刪除後,新增虛擬頭")
    }
    if true {
        head := &ListNode{}
        head.Val = 1

        head.Next = &ListNode{}
        head.Next.Val = 5

        head.Next.Next = &ListNode{}
        head.Next.Next.Val = 1

        head.Next.Next.Next = &ListNode{}
        head.Next.Next.Next.Val = 9

        headtemp := head
        for headtemp != nil {
            fmt.Print(headtemp.Val, "\t")
            headtemp = headtemp.Next
        }
        fmt.Println("刪除前")
        head = DeleteNode2(head, 1)
        headtemp = head
        for headtemp != nil {
            fmt.Print(headtemp.Val, "\t")
            headtemp = headtemp.Next
        }
        fmt.Println("刪除後,換頭法")
    }
}

// Definition for singly-linked list.
type ListNode struct {
    Val  int
    Next *ListNode
}

//新增虛擬頭,返回head.Next
func DeleteNode1(head *ListNode, val int) *ListNode {
    //前一個節點
    pre := &ListNode{}
    pre.Next = head
    //當前節點
    cur := head
    //頭節點
    head = pre

    for cur != nil {
        if cur.Val == val { //如果當前節點正好是刪除節點
            pre.Next = cur.Next //前一個節點指向後一個節點
        } else {
            pre = cur //不刪除,需要遍歷。當前節點變成前一個節點
        }
        //下一個節點變成當前節點
        cur = cur.Next
    }

    return head.Next
}

//換頭,返回head
func DeleteNode2(head *ListNode, val int) *ListNode {
    //換頭
    for head != nil && head.Val == val {
        head = head.Next
    }

    //當前節點
    cur := head
    //前一個節點
    var pre *ListNode = nil
    for cur != nil {
        if cur.Val == val { //如果當前節點正好是刪除節點
            pre.Next = cur.Next //前一個節點指向後一個節點,pre節點不可能為空的
        } else {
            pre = cur //不刪除,需要遍歷。當前節點變成前一個節點
        }
        //下一個節點變成當前節點
        cur = cur.Next
    }

    return head
}

  用 go test -v -test.run TestDeleteNode 命令,執行結果如下:

***
[評論](https://user.qzone.qq.com/3182319461/blog/1596754839)