常见链表题及其 Go 实现

简介: 从链表中移除一个重复的值,链表是有序的。在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

链表中删除重复项


从链表中移除一个重复的值,链表是有序的。在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5


Go 语言实现如下:

func(list *List) RemoveDuplicate() {
  curr := list.head
  for curr != nil {
    if curr.next != nil && curr.value == curr.next.value {
      curr.next = curr.next.next
    } else {
      curr = curr.next
    } 
  }
}

算法分析:

该算法只用了一层循环,for 循环用于遍历列表。 每当有一个节点的值等于下一个节点的值时,该当前节点下一个将指向下一个节点的下一个。 这将从列表中删除下一个节点,算法复杂度为 O(n)

链表反转


将链表的内容以相反的顺序复制到另一个链表中。 如果原始链表包含顺序为 1,2,3,4 的元素,则新链表应包含顺序为 4,3,2,1 的元素。

func(list *List) CopyListReversed() *List {
  var tempNode, tempNode2 * Node
  curr := list.head
  for curr != nil {
    tempNode2 = &Node{curr.value, tempNode}
    curr = curr.next
    tempNode = tempNode2
  }
  ll2 := new(List)
  ll2.head = tempNode
  return ll2
}


遍历列表并将节点的值添加到新列表中。 由于列表是正向遍历的,并且每个节点的值都被添加到另一个列表中,所以形成的列表与给定列表相反.


链表对比

比较给定头指针的两个链表的值。

func (list *List) CompareList(ll *List) bool {
  return list.compareListUtil(list.head, ll.head)
}
func(list *List) compareListUtil(head1 *Node, head2 *Node) bool {
  if head1 == nil && head2 == nil {
    return true
  } else if (head1 == nil) || (head2 == nil) || (head1.value != head2.value) {
    return false
  } else {
    return list.compareListUtil(head1.next, head2.next)
  }
}
  • 列表是递归比较的。 此外,如果我们到达列表的末尾并且两个列表都是空的。 然后两个列表相等,因此返回 true
  • 列表是递归比较的。 如果列表中的任何一个为空或对应节点的值不相等,则此函数将返回 false。
  • 递归调用当前节点的下一个节点的比较列表函数。
相关文章
|
Go 数据库 数据安全/隐私保护
Go实现随机加盐密码认证
Go实现随机加盐密码认证
294 0
|
存储 缓存 人工智能
基于Go的缓存实现
缓存是架构设计中的常用概念,本文基于Go实现了一个简单的缓存组件,支持最基本的缓存操作。
274 0
基于Go的缓存实现
|
存储 缓存 NoSQL
一文搞懂Go整合captcha实现验证码功能
一文搞懂Go整合captcha实现验证码功能
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
|
监控 测试技术 Go
用 Go 从零实现日志包 - 第零篇 序言
设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。
131 0
|
存储
链表的实现:无头单向非循环链表的实现
链表的实现:无头单向非循环链表的实现
70 0
链表的实现:无头单向非循环链表的实现
|
Go 数据安全/隐私保护
Go 实现 AES 加密 CBC 模式|Go主题月
密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
327 0
|
Go
【Golang】panic和recover底层逻辑实现|Go主题月
在每个goroutine也有一个指针指向_panic链表表头,然后每增加一个panic就会在链表头部加入一个_panic结构体。当所有的defer执行完后,_panic链表就会从尾部开始打印panic信息了,也就是说先发生的panic先打印信息。
211 0
|
Go 索引 Python
Go 和Python中的闭包实现及使用
Go 和Python中的闭包实现及使用
118 0