2020-08-07:给定单向链表的头指针和一个要删除的值,返回删除后的链表的头节点。
【摘要】 福哥答案2020-08-07:1.新增虚拟头,返回head.Next。2.换头,返回head。代码用go语言编写,如下:package test32_deletenode import ( "fmt" "testing") //go test -v -test.run TestDeleteNodefunc TestDeleteNode(t *testing.T) { if ...
福哥答案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 命令,执行结果如下:

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)