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

package main

import (
	"fmt"
)

type ListNode1 struct {
	Val  int
	Next *ListNode1
}

func (l *ListNode1) Insert(insertVal, beforeVal int) {
	for n := l; n != nil; n = n.Next {
		// fmt.Printf("l.Val, val: %v\n", l.Val)
		if n.Val == beforeVal {
			// fmt.Printf("matched, val: %v\n", n.Val)

			node := ListNode1{
				Val:  insertVal,
				Next: n.Next,
			}

			n.Next = &node

			break
		}
	}

	// fmt.Printf("List: %s\n", l.String())
}

func (l *ListNode1) DeleteByVal(val int) {
	if l != nil && l.Val == val && l.Next != nil {
		*l = *l.Next
	}

	// fmt.Printf("new list: %s\n", l.String())

	for n := l; n != nil; n = n.Next {
		if n.Next != nil && n.Next.Val == val {
			n.Next = n.Next.Next
		}
	}

	// fmt.Printf("new list3: %s\n", l.String())
}

func (l *ListNode1) String() string {
	r := ""

	for n := l; n != nil; n = n.Next {
		r += fmt.Sprintf("%v ", n.Val)
	}

	return r
}

func main() {
	var nodeCount int
	fmt.Scan(&nodeCount)
	// fmt.Printf("nodeCount: %v\n", nodeCount)

	var headVal int
	fmt.Scan(&headVal)
	// fmt.Printf("nodeVal: %v\n", headVal)

	var nodeList = ListNode1{Val: headVal}

	currNodeCount := 1
	for currNodeCount < nodeCount {
		var insertVal, beforeVal int
		fmt.Scan(&insertVal, &beforeVal)
		// fmt.Printf("insertVal: %v, beforeVal: %v\n", insertVal, beforeVal)

		nodeList.Insert(insertVal, beforeVal)
		currNodeCount++
	}

	var deleteVal int
	fmt.Scan(&deleteVal)

	nodeList.DeleteByVal(deleteVal)
	// fmt.Printf("new list2: %s\n", nodeList.String())

	fmt.Printf("%s\n", nodeList.String())
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:37
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务