博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang面试考题记录 ━━ 删除链表中的节点,首先明白什么是链表,其次语文要好能看懂题
阅读量:4115 次
发布时间:2019-05-25

本文共 2015 字,大约阅读时间需要 6 分钟。

问:

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 – head = [4,5,1,9],它可以表示为:

在这里插入图片描述

示例 1:

输入: head = [4,5,1,9], node = 5

输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], node = 1

输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

  • 链表至少包含两个节点。
  • 链表中所有节点的值都是唯一的。
  • 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
  • 不要从你的函数中返回任何结果。

答:

题目要求中已经限定得很死,传入的是需要删除的节点,那么方法就很简单了。

但在实际项目中写删除函数,还是要考虑很多东西的,比如内存泄漏、前后指针等。

方法一:

执行用时 :4 ms, 击败了79.65%的用户
内存消耗 :2.9 MB, 击败了100.00%的用户

func deleteNode1(node *ListNode) {
node.Val = node.Next.Val node.Next = node.Next.Next}

方法二:

执行用时 :0 ms, 击败了7100.00%的用户
内存消耗 :2.9 MB, 击败了33.33%的用户

func deleteNode2(node *ListNode) {
*node = *(node.Next)}

解:

这道题初做很难理解,什么玩意儿,明明要删值为5的节点,怎么传入函数的不是值,却是个节点?前后都没有。。。

注意:题目中的函数参数node是个节点,那么这个节点是啥?其实就是需要删除的节点。这道题里我们并不需要知道Val是什么,这是出题平台的事。

我试着将整个删除流程写了一下,希望能帮助大家更好理解是具体是如何实现的。

package mainimport "fmt"type ListNode struct {
Val int Next *ListNode}func main() {
// 预置切片,待会儿生成单链表要用 head := []int{
4, 5, 1, 9} // 待删除节点所含的Val值 node := 5 // 分配内存空间 var ln = new(ListNode) // 头指针 listHead := ln // 创建单链表 for i := 0; i < 4; i++ {
// Val赋值 ln.Val = head[i] // i<3这个条件可以不给,只不过这样的话最后一个节点的Next不是nil,多占用了一份内存空间 if i < 3 {
// 给下一个节点分配一个内存空间 ln.Next = new(ListNode) // 将本次ln的内存地址改到下一个的Next上 ln = ln.Next } } // 输出完整 ln = listHead // 循环四次,每次显示后ln都指向到下一个ln的指针去 for i := 0; i < 4; i++ {
fmt.Println(ln.Val) ln = ln.Next } fmt.Print("重置ln,准备删除... ") // 删除某一个节点 ln = listHead for i := 0; i < 4; i++ {
if ln.Val == node {
// ============================================== // 完成本题需要的操作,传入的不是Val,而是ln(*ListNode) // ============================================== deleteNode1(ln) // 完成修改后跳出循环 break } ln = ln.Next } fmt.Println("...删除结束,重置ln") // 输出删除后的单链表 ln = listHead for i := 0; i < 3; i++ {
fmt.Println(ln.Val) ln = ln.Next }}func deleteNode1(node *ListNode) {
node.Val = node.Next.Val node.Next = node.Next.Next}

输出结果

4

5
1
9
重置ln,准备删除… …删除结束,重置ln
4
1
9

参:

《》

《》

转载地址:http://atkpi.baihongyu.com/

你可能感兴趣的文章
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>
web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
查看>>
web.py 0.3 新手指南 - 多数据库使用
查看>>
一步步开发 Spring MVC 应用
查看>>
python: extend (扩展) 与 append (追加) 的差别
查看>>
「译」在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?...
查看>>
浅谈JavaScript的语言特性
查看>>
LeetCode第39题思悟——组合总和(combination-sum)
查看>>
LeetCode第43题思悟——字符串相乘(multiply-strings)
查看>>
LeetCode第44题思悟——通配符匹配(wildcard-matching)
查看>>
LeetCode第45题思悟——跳跃游戏(jump-game-ii)
查看>>
LeetCode第46题思悟——全排列(permutations)
查看>>
LeetCode第47题思悟—— 全排列 II(permutations-ii)
查看>>
LeetCode第48题思悟——旋转图像(rotate-image)
查看>>
驱动力3.0,动力全开~
查看>>
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>
记CSDN访问20万+
查看>>