链表的python实现

链表的特点

链表是一种基础的数据结构,其特点为:

链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素 的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素,需要从第一个元素始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表

链表组成分析

根据面向对象的编程思想,链表和组成链表的节点都是一种对象,是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)

猜你喜欢

转载自blog.csdn.net/lzq20115395/article/details/78723021
今日推荐