题解 | 从单向链表中删除指定值的节点
从单向链表中删除指定值的节点
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 }