每日一题 --- 设计链表[力扣][Go]

设计链表

题目:707. 设计链表

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:valnextval 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  • MyLinkedList() 初始化 MyLinkedList 对象。
  • int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1
  • void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  • void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  • void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  • void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例:

go 复制代码
输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]

解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

提示:

  • 0 <= index, val <= 1000
  • 请不要使用内置的 LinkedList 库。
  • 调用 getaddAtHeadaddAtTailaddAtIndexdeleteAtIndex 的次数不超过 2000

方法一:

我使用的是单链表法,思想其实就是明确链表操作,具体可以参考:代码随想录

代码如下:

design707_test.go

go 复制代码
package test

import (
   "fmt"
   "testing"
)

type MyLinkedList struct {
   Val  int
   Next *MyLinkedList
}

func Constructor() MyLinkedList {
   return MyLinkedList{}
}

func (this *MyLinkedList) Get(index int) int {
   p := this
   for p.Next != nil && index >= 0 {
      p = p.Next
      index--
   }
   if index < 0 {
      return p.Val
   } else {
      return -1
   }

}

func (this *MyLinkedList) AddAtHead(val int) {
   p := this
   node := &MyLinkedList{Val: val}
   node.Next = p.Next
   p.Next = node
}

func (this *MyLinkedList) AddAtTail(val int) {
   p := this
   for p.Next != nil {
      p = p.Next
   }
   node := &MyLinkedList{Val: val}
   node.Next = p.Next
   p.Next = node
}

func (this *MyLinkedList) AddAtIndex(index int, val int) {
   p := this
   for p.Next != nil && index != 0 {
      p = p.Next
      index--
   }
   if index == 0 {
      node := &MyLinkedList{Val: val}
      node.Next = p.Next
      p.Next = node
   }
}

func (this *MyLinkedList) DeleteAtIndex(index int) {
   p := this
   for p.Next != nil && index != 0 {
      index--
      p = p.Next
   }
   if p.Next != nil && index == 0 {
      p.Next = p.Next.Next
   }
}

func Test707(t *testing.T) {
   obj := Constructor()
   obj.AddAtHead(1)
   obj.PEach()
   obj.AddAtTail(3)
   obj.PEach()
   obj.AddAtIndex(1, 2)
   obj.PEach()
   fmt.Println(obj.Get(1))
   obj.DeleteAtIndex(1)
   obj.PEach()
   fmt.Println(obj.Get(1))
}

func (this *MyLinkedList) PEach() {
   n := 1
   for this.Next != nil {
      fmt.Printf("%d:%d \t", n, this.Next.Val)
      this = this.Next
      n++
   }
   fmt.Println()
}

当然这一题也可以使用双链表来写,思路是相同的,查询操作是相同的,删除和插入操作需要考虑前驱指针和后继指针。这就是方法二,不过由你们实现,快去试试吧。

相关推荐
papership12 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_7968265212 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u13 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
_深海凉_16 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录17 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre20 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre1 天前
739 每日温度
算法·leetcode·职场和发展
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙9801 天前
day37-数据结构力扣
数据结构·算法·leetcode
止语Lab1 天前
Gin 很好,但你的项目可能需要更多
golang·gin