链表用头结点还是头指针让我混乱。在写append函数时,发现网上的写法各有不同,而带头结点的会更好理解,也更简洁。
以下是带头结点的单链表一些简单的相关函数。
class Node:#单向链表节点
def __init__(self,elem,next=None):
self.elem=elem #值域
self.next=next #指针域
class Link:#定义带头节点的单向链表
#需要用到的函数:初始化,判断是否为空,求链表长度,遍历链表,查找元素是否存在
#尾部添加元素,头部添加元素,删除指定节点,指定位置插入元素
def __init__(self,data):
self.head=Node(None) #头节点里面装的元素none
for i in data:
self.append(i)
def is_empty(self):#判断是否为空
if self.head.next is None: #如果为空返回1
return 1
def length(self):
if self.is_empty():
return 0
else:
len=0
p=self.head
while(p.next):
p=p.next
len+=1
return len
def travel(self):#遍历链表
if self.is_empty():
return
p=self.head
while(p.next is not None):
p=p.next
print(p.elem,end=' ')
def find_elem(self,tar):#查找元素是否存在
p = self.head
while (p.next is not None):
if p.elem==tar:
print('存在元素',tar)
return 1
p = p.next
def append(self,item):#尾部添加元素
cur=self.head #当前节点
new_node = Node(item)
while(cur.next is not None):
cur=cur.next
cur.next=new_node
def add(self,item):#头部添加元素
new_node=Node(item)
new_node.next=self.head.next
self.head.next=new_node
def insert(self,pos,item):#在pos位置前插入元素
new_node=Node(item)
cur=self.head
count=0
while cur.next is not None:
cur=cur.next
count+=1
if count==pos-1:
break
new_node.next=cur.next
cur.next=new_node
def remove(self,item):#删除指定内容的节点
cur=self.head.next
pre=self.head
while cur.next is not None:
if cur.elem==item:
break
cur=cur.next
pre=pre.next
pre.next=cur.next
data=[1,2,3,4]
myLink=Link(data)
myLink.travel()
myLink.find_elem(1)
myLink.add(0)
myLink.append(5)
myLink.travel()
myLink.insert(3,1.5)
print('\n')
myLink.travel()
myLink.remove(1.5)
print('\n')
myLink.travel()
print('\n')
print('链表长度为',myLink.length())