链表的特点
链表是一种基础的数据结构,其特点为:
链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素 的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素,需要从第一个元素始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表
链表组成分析
根据面向对象的编程思想,链表和组成链表的节点都是一种对象,是Node类和Linked类的实例。
- node类:(1)存储该节点的数据:key。(2)指向下一节点的指针:_next
- Linked类:(1) 指向链表第一个node对象的指针:_head (2)表示链表长度的变量:_length
链表的实现(Python)
功能
-判断链表是否为空:is_empty()
- 返回链表长度:get_length()
- 链表头部添加节点:append_head()
- 链表尾部添加节点:append_tail()
- 查询链表中是否存在指定元素:search()
- 返回特定位置index节点数据:return_index()
- 向特定位置插入元素节点:insert_node()
- 更新某一节点数据:updata_node()
- 删除链表节点:delete_node()
- 打印链表:print_link()
- 清空链表:clear()
代码
#定义节点类
class Node(object):
def __init__(self,key,val=None):
self._key=key
self._next=val
def get_key(self):
return self._key
def get_next(self):
return self._next
def set_key(self,value):
self._key=value
def set_next(self,val):
self._next=val
class Tree(object):
def __init__(self): #链表的属性:指向头部的指针和链表长度
self._head=None
self._length=0
#链表是否为空
def is_empty(self):
return self._length==0
#链表长度
def get_length(self):
print '链表长度为:',self._length
#在链表头部添加元素
def append_head(self,key):
node=Node(key)
node.set_next(self._head)
self._head=node
self._length+=1
#在链表尾部添加元素
def append_tail(self,key):
node=self._head
while node.get_next():
node=node.get_next()
node.set_next(Node(key))
self._length+=1
#搜索链表中是否存在指定值
def search(self,key):
node=self._head
flag= True
while node.get_key()!=key:
node=node.get_next()
if not node:
flag=False
break
if flag:
print '链表中存在元素',key
else:
print '链表中不存在元素',key
#返回特定节点的值
def return_index(self,index):
if (index>self._length) or (index <1):
return 'index is invalid'
s=1
node=self._head
while s<index:
node=node.get_next()
s+=1
return node.get_key()
#链表特定位置插入元素
def insert_node(self,key,site):
if site<=1:
self.append_head(key)
return
elif site>=self._length:
self.append_tail(key)
return
n=Node(key)
node=self._head
x=1
while x<site:
t=node
node=node.get_next()
x+=1
t.set_next(n)
n.set_next(node)
self._length+=1
#更新链表元素值
def updata_node(self,index,key):
if (index>self._length) or (index <1):
print 'index is invalid'
return
x=1
node=self._head
while x<index:
node=node.get_next()
x+=1
node.set_key(key)
#删除链表某一节点元素:删除开头结尾处节点需要分开处理
def delete_node(self,index):
if self.is_empty():
print '列表为空!'
return
elif (index>self._length) or (index <1):
print 'index is invalid'
return
if index==1:
self._head=self._head.get_next()
elif index==self._length:
t=1
node=self._head
while t<self._length-1:
node=node.get_next()
t+=1
node.set_next(None)
elif 1<index< self._length:
node=self._head
x=1
while x<index:
p=node
node=node.get_next()
n=node.get_next()
x+=1
p.set_next(n)
self._length-=1
#清空链表元素
def clear(self):
self._head=None
self._length=0
#打印链表
def print_link(self):
t=1
node=self._head
while t<=self._length:
print '第',t,'个元素:',node.get_key()
node=node.get_next()
t+=1
if __name__=='__main__':
tree=Tree()
tree.append_head(10)
tree.append_tail(8)
tree.insert_node(4,0)
tree.print_link()
tree.delete_node(3)
tree.print_link()
tree.clear()
tree.delete_node(1)