链表1(单向链表)

链表的定义:

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。

单向链表:

单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

 

  • 表元素域elem用来存放具体的数据。
  • 链接域next用来存放下一个节点的位置(python中的标识)
  • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

Python中地址的获取(C语言中有指针,但Python中没有):

(a,b交换前)(a,b交换后,保存10的地方还存10,存20的地方还存20,改变的只是a,b自己维护的东西

 先找个空间把10存起来,紧接着产生一个标号a这个新的变量,又找到一块内存把a和它绑在一起,这时候的a就代表一块空间,只不过这个空间不是存的10,而是存的10这个单元的地址

有一块空间存了f这个函数,让a=f其实就是让a 指向存储f的这块空间,同理,next=node2就是next存了node2的地址,即next指向node 

单链表的操作:

  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

 代码实现:

class Node(object):
    """定义节点这个类"""
    def __init__(self,elem):
        self.elem = elem   #创建这个类的对象时就可以给他传入要保存的数据
        self.next = None   #刚开始不知道指向谁,所以置为空

#node = Node(100)

class Singlelinklist(object):
    """定义单链表,这个类里要实现单链表的各种操作,如链表长度,往链表添加元素等"""
    def __init__(self,node=None):    
        self._head = node    #保存头结点,私有属性


    def is_empty(self):
        """链表是否为空"""
        return self._head   #返回的是True or False?

    def length(self):
        """链表长度"""
        cur = self._head    #游标,用来移动遍历节点,刚开始让他等于head也就是和head指向同一个地址
        count = 0        #记录数量
        while cur !=None:
            cur = cur.next
            count += 1
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self._head
        while cur != None:
            #print(self.elem)   错辽,这里的self指的是sll呀
            print(cur.elem,end=" ")  #打印在同一行end="",在Python2中逗号就行了
            cur = cur.next


    def add(self,item):
        """链表头部添加元素,头插法"""
        node = Node(item)
        node.next = self._head
        self._head = node

    def append(self,item):
        """链表尾部添加元素"""
        node = Node(item)
        #if self.is_empty():    #相当于if self_head == None
        if self._head == None:
            self._head = node
        else:
            cur = self._head
            while cur.next != None:
                cur = cur.next
            cur.next = node

    def insert(self,pos,item):
        """指定位置添加元素"""
        node = Node(item)
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            pre = self._head
            count = 0
            while count <(pos-1):
                count += 1
                pre = pre.next
            node.next = pre.next
            pre.next = node

    def remove(self,item):
        """删除节点"""
        cur = self._head
        pre = None
        while cur != None:   #找到要删的节点了就删,没找到的话游标就接着移动
            if cur.elem == item:
                if cur == self._head:
                    self._head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next

    def search(self,item):
        """查看节点是否存在"""
        cur = self._head
        while cur != None:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False

#测试
if __name__ == "__main__":    #只在当前文件下运行时执行
    sll = Singlelinklist()
    print(sll.is_empty())  #None
    print("什么都不添加时的长度:")
    print(sll.length())    #0

    sll.append(1)
    print(sll.is_empty())   #非空,打印的是self._head
    print("添加了1时的长度:")
    print(sll.length())    #1

    sll.append(2)
    sll.append(3)
    sll.append(4)
    sll.append(5)
    sll.append(6)  #1 2 3 4 5 6
    sll.add(10)   #10 1 2 3 4 5 6
    sll.insert(3,100)  #10 1 2 100 3 4 5 6
    sll.insert(10,1000)  #10 1 2 100 3 4 5 6
    sll.remove(10)  #删头结点
    print("开始遍历所有元素:")
    sll.travel()
   
    print("length:",sll.length())

    print(sll.search(6))  #查一下6在不在链表里
    
    
View Code

猜你喜欢

转载自www.cnblogs.com/fenglivoong/p/12628210.html