python/golang 删除链表中的元素
作者:NothingLeft了 发布时间:2021-05-05 14:08:07
标签:python,golang,删除,链表
先用使用常规方法,两个指针:
golang实现:
type Node struct {
value int
next *Node
}
type Link struct {
head *Node
tail *Node
lenth int
}
// 向链表中添加元素
func (link *Link) add(v int) {
if link.lenth == 0 { // 当前链表是空链表
link.head = &Node{v, nil}
link.tail = link.head
link.lenth = 1
} else {
newNond := &Node{v, nil}
link.tail.next = newNond
link.tail = newNond
link.lenth += 1
}
}
// 删除链表中的元素(双指针)
func (link *Link) remove(v int) {
if link.lenth == 0 {
fmt.Println("空链表,不支持该操作")
return
}
var previous *Node = nil
for current := link.head; current != nil; current = current.next {
if current.value == v {
if current == link.head { // 要删除的是头节点
link.head = current.next
} else if current == link.tail { // 要删除的是尾节点
previous.next = nil
link.tail = previous
} else { // 要删除的是中间的节点
previous.next = current.next
}
link.lenth -= 1
break
}
previous = current
}
}
// 打印链表
func (link *Link) printList() {
if link.lenth == 0 {
fmt.Println("空链表")
return
}
for cur := link.head; cur != nil; cur = cur.next {
fmt.Printf("%d ", cur.value)
}
fmt.Println()
}
python实现:
class Node:
def __init__(self, value, next):
self.value = value
self.next = next
def __str__(self):
return str(self.value)
class Link:
def __init__(self):
self.head = None
self.tail = None
self.lenth = 0
# 向链表中添加元素
def add(self, v):
if self.lenth == 0: # 当前链表是空链表
self.head = Node(v, None)
self.tail = self.head
self.lenth = 1
else:
new_node = Node(v, None)
self.tail.next = new_node
self.tail = new_node
self.lenth += 1
# 打印链表
def print(self):
if self.lenth == 0:
print('空链表')
return
cur = self.head
while True:
if cur == None:
print()
break
print(cur, end=' ')
cur = cur.next
# 删除链表中的元素
def remove(self, v):
if self.lenth == 0:
return
cur = self.head
pre = None
while True:
if cur.value == v:
if cur == self.head: # 要删除的是头节点
self.head = cur.next
elif cur == self.tail: # 要删除的是尾节点
pre.next = None
self.tail = pre
else: # 要删除的是中间的节点
pre.next = cur.next
self.lenth -= 1
break
pre = cur
cur = cur.next
if cur == None:
print("未找到", v)
break
只使用使用一个指针实现链表的删除:
golang实现:
func (link *Link) remove_with_one_pointer(v int) {
if link.lenth == 0 {
return
}
if link.tail.value == v { // 要删除的节点是尾节点,需特殊处理
if link.lenth == 1 { // 如果链表只有一个节点
link.head = nil
link.tail = nil
} else { //大于一个节点
cur := link.head
for ; cur.next.next != nil; cur = cur.next {
} //找到尾节点的前一个节点
cur.next = nil
link.tail = cur
}
link.lenth -= 1
return
}
//要删除的节点在头部/中间 的常规情况
for cur := link.head; cur != nil; cur = cur.next {
if cur.value == v {
cur.value = cur.next.value
cur.next = cur.next.next
link.lenth -= 1
return
}
}
fmt.Println("未找到", v)
}
python实现:
def remove_with_one_pointer(self, v):
if self.lenth == 0:
return
if self.tail.value == v: # 要删除的节点是尾节点,需特殊处理
if self.lenth == 1: # 如果链表只有一个节点
self.head = None
self.tail = None
else: # 大于一个节点
cur = self.head
while True:
if cur.next.next is None: # 找到尾节点的前一个节点
break
else:
cur = cur.next
cur.next = None
self.tail = cur
self.lenth -= 1
return
# 要删除的节点在头部/中间 的常规情况
cur = self.head
while True:
if cur.value == v:
cur.value = cur.next.value
cur.next = cur.next.next
self.lenth -= 1
break
cur = cur.next
if cur is None:
print('未找到', v)
break
来源:https://www.jianshu.com/p/8554d637702a


猜你喜欢
- 前言Tripadvisor是全球领先的旅游网站,主要提供来自全球旅行者的点评和建议,全面覆盖全球的酒店、景点、餐厅、航空公司 ,以及旅行规划
- 思路利用scapy库,在这个库的基础下能够做很多的事情,python读取pcap包网上一找一大把将读取出来的pcap包改一个名字,然后写回,
- 在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在
- 本文来给大家介绍一个php版淘宝网查询商品接口代码的例子,下面要改成你的信息的在代码后面都有说明了,同时sdk包我们也要官方下载。下载SDK
- 读取十万多条文本写入SQLite类型数据库,由于文本中存在中文字符,插入到数据库没错,取出时一直是UnicodeDecodeError,导致
- 1、页签的表达。页签表达很清晰,当前页签突出,且层级包涵关系明确;看下图,一目了然的感觉,不用疑惑我在那部分里。不信?拿当当的对比一下,你感
- 废话就不多说了,直接上内容。<form action="/home/search" method="ge
- 本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数。主要步骤:1.提示用户输入爬取的内容及页码。2.根据用户输入,获取网址列表。3.
- (一)原理 小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,
- 我就废话不多说了,直接上代码吧!import torchimport torch.nn as nnfrom torch.autograd i
- 在这个abc.php文件中写入如下代码。<?php phpinfo(); ?>你将会看到一个网页,网页内容通常,如下图所示:用中
- 1.首先在Pycharm Tools->Deployment->Configurations打开新建SFTP输入host: ip
- 通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。1. 什
- 本文介绍了linux下如何备份与恢复mysql数据库。数据库备份是非常重要的。如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次
- 前言做前端开发几年,在项目中用到数组去重的机会倒不是很多,但是在面试的时候却经常被问到,个人理解,这道题真正考的是对JavaScript的基
- 本文实例为大家分享了Python使用Pygame绘制时钟的具体代码,供大家参考,具体内容如下前提条件:需要安装pygame功能:1.初始化界
- jieba 库是优秀的中文分词第三方库,中文文本需要通过分词获得单个的词语1、jieba库安装管理员身份运行cmd窗口输入命令:pip in
- base64 其实是一种编码转换方式, 将 ASCII 字符转换成普通文本, 是网络上最常见的用于传输8Bit字节代码的编码方式之一。bas
- 对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。from rest_framework.throttling im
- 第一种情况:有RAID,还需要做数据库备份吗?回答:需要。有了RAID,万一部份磁盘损坏,可以修复数据库,有的情况下数据库甚至可以继续使用。