题解 | 从单向链表中删除指定值的节点
从单向链表中删除指定值的节点
https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
// 输入
scanner := bufio.NewScanner(os.Stdin)
var input string
scanner.Scan()
input = scanner.Text()
//根据字符串的空格来分割字符串(包括连续空格)
parts := strings.Fields(input)
var nums []int
//存入int切片
for _, part := range parts {
num, _ := strconv.Atoi(part)
nums = append(nums, num)
}
//如果num[0]等于0直接输出nil
if nums[0] == 0 {
fmt.Print(nil)
return
}
// 初始化一个带头节点的链表
head := &Node{
value: -1,
next: nil,
}
// 插入第一个节点
insertNode(head, nums[1], -1)
// 插入后续结点
// nums[i*2+1]后面插入num[i*2]
for i := 1; i < nums[0]; i++ {
insertNode(head, nums[i*2], nums[i*2+1])
}
// 删除操作
for i := nums[0] * 2; i < len(nums); i++ {
deleteNode(head, nums[i])
}
// 输出
p := head.next
if p == nil {
fmt.Print(nil)
} else {
for p != nil {
fmt.Printf("%d ", p.value)
p = p.next
}
}
}
// 插入操作,将b放在a后面
func insertNode(head *Node, tow, one int) {
// q是新结点
q := &Node{
value: tow,
next: nil,
}
if head.value == one {
head.next = q
return
}
p := head.next
for p != nil {
if p.value == one {
q.next = p.next
p.next = q
return
}
// 若值不等于a,则指针后移
p = p.next
}
}
func deleteNode(head *Node, value int) {
pre := head
p := head.next
for p != nil {
if p.value == value {
pre.next = p.next
return
}
//未找到,指针后移
p = p.next
pre = pre.next
}
}
type Node struct {
value int
next *Node
}


