链表

顺序表需要有连续的空间,相对便于查找,但对数据的处理较为不便。

    引入链表

链表存储空间可以不连续,通过链接/指针 指向下一个数据的地址。

链表的一个节点由数据和链接两部分组成。

链表特征:储存了根节点的地址,按顺序有向一个指向下一个

 

节点操作:

  __init__(self,d,n=None)  初始化

  get_next(self)  获取下一个节点

  set_next(self,n)  设置下一个节点

  get_data(self)  获取数据

  set_data(self,d)  设置数据

  has_next(self)  判断下一个数据

  to_string(self)  以字符串打印

链表操作:

  __init__(self,r=None)  初始化

  get_size(self)  返回长度,多少个节点

  add(self,d)   加入数据,创建一个节点指向原来的根节点,作为新根

  add_node(self,n)  加入节点,放在最前面,指针指向原根节点。

  remove(self,d)  删除一个节点     文字伪代码:赋值当前节点为根节点

                                                                           赋值先前节点为空

                                                                           当前节点不为空,判断是不是要找的值

                                                                           是  将先前节点的指针指向下一节点

                                                                           否  查找下一节点

                                                                           若没有要找的值,报错

 

python代码实现

#coding=utf-8
class Node(object):
    def __init__(self,d,n=None):
        self.data=d
        self.next_node=n
   
    def get_next(self):
        return self.next_node
   
    def set_next(self,n):
        self.next_node=n
       
    def get_data(self):
        return self.data
   
    def set_data(self,d):
        self.data=d
       
    def has_next(self):
        if self.get_next() is None:
            return False
        return True
   
    def to_string(self):
        return 'Node value:'+str(self.data)
   
   
class LinkedList(object):  
    def __init__(self,r=None):
        self.root=r
        self.size=0
       
    def get_size(self):
        return self.size
   
    def add(self,d):
        new_node=Node(d,self.root)
        self.root=new_node
        self.size += 1
       
    def add_node(self,n):         #加入一个节点,区别是已有指针
        n.set_next(self.root)
        self.root=n
        self.size += 1
       
    def remove(self,d):
        this_node=self.root
        prev_node=None
       
        while this_node is not None:
            if this_node.get_data() == d:
                if prev_node is not None:   #不是根节点
                    prev_node.set_next(this_node.get_next())
                else:      #是根节点
                    self.root=this_node.get_next()
                self.size -=1
                return True    # data removed
            else:            #看下一个是不是
                prev_node=this_node
                this_node=this_node.get_next()
        return False    # data not found    
   
    def find(self,d):
        this_node = self.root
        while this_node is not None:
            if this_node.get_data() == d:
                return d
            elif this_node.get_next() == None:
                return False
            else:
                this_node=this_node.get_next()
               
    def print_list(self):
        print('print list.....')
        if self.root is None:
            return       #根节点为空,返回空
        this_node=self.root
        print(this_node.to_string())
        while this_node.has_next():
            this_node=this_node.get_next()
            print(this_node.to_string())
           
    def sort(self):
        if self.size>1:
            newlist=[]
            current=self.root
            newlist.append(self.root)
            while current.has_next():
                current=current.get_next()
                newlist.append(current)
            newlist=sorted(newlist,key=lambda node:node.get_data(),reverse=True)
            newll=LinkedList()
            for node in newlist:
                newll.add_node(node)
            return newll
        return self
posted @ 2021-11-13 23:48  周意凯  阅读(137)  评论(0编辑  收藏  举报