题解 | 从单向链表中删除指定值的节点

从单向链表中删除指定值的节点

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
}

全部评论

相关推荐

05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务