美文网首页
2018-07-01链表概念和编程实现

2018-07-01链表概念和编程实现

作者: 菩灵 | 来源:发表于2018-07-01 21:47 被阅读7次

    顺序表的特点是要求存储空间必须连续,一旦不够,就要动态地改变数据区。
    那么,有没有一种数据结构,在增加的时候不用改变数据区?

    链表的定义:

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


    链表

    *线性表:表现为一维空间存储的数据结构:顺序表+链表

    优点:链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

    实现方式:把原来的数据扩展,由单一保存数字变为保存数字+地址
    分别命名为:数据区+链接区

    单项链表:

    第一个节点是头结点
    最后一个叫做尾节点,链接区地位为空


    尾节点
    a = 10
    b = 20
    a, b = b, a
    

    只在python中有。

    在其他语言中,a = 10,把a当作10所在存储空间的一个别名。
    但是在Python中比较另类。
    在python中,一切皆对象,a不具有太大意义,仅仅作为一个变量名拥有一个地址,这个地址指向它所应该指向的对象。


    链表的构成原理

    python中的“=”,实际上是产生了一个引用的链接。

    单链表的程序实现:

    # coding:utf-8
    
    
    class Node(object):
        """节点"""
        def __init__(self, elem):
            self.elem = elem
            self.next = None
    
    
    class SingleLinkList(object):
        """单链表"""
        def __init__(self, node=None):
            self.__head = node
    
        def is_empty(self):
            """链表是否为空"""
            return self.__head == None
    
        def length(self):
            """链表长度"""
            # cur游标,用来移动遍历节点
            cur = self.__head
            # count记录数量
            count = 0
            while cur != None:
                count += 1
                cur = cur.next
            return count
    
        def travel(self):
            """遍历整个链表"""
            cur = self.__head
            while cur != None:
                print(cur.elem, end=" ")
                cur = cur.next
            print("")
    
        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():
                self.__head = node
            else:
                cur = self.__head
                while cur.next != None:
                    cur = cur.next
                cur.next = node
    
        def insert(self, pos, item):
            """指定位置添加元素
            :param  pos 从0开始
            """
            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
                # 当循环退出后,pre指向pos-1位置
                node = Node(item)
                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__":
        ll = SingleLinkList()
        print(ll.is_empty())
        print(ll.length())
    
        ll.append(1)
        print(ll.is_empty())
        print(ll.length())
    
    
        ll.append(2)
        ll.add(8)
        ll.append(3)
        ll.append(4)
        ll.append(5)
        ll.append(6)
        # 8 1 2 3 4 5 6
        ll.insert(-1, 9) # 9 8 1 23456
        ll.travel()
        ll.insert(3, 100) # 9 8 1 100 2 3456
        ll.travel()
        ll.insert(10, 200) # 9 8 1 100 23456 200
        ll.travel()
        ll.remove(100)
        ll.travel()
        ll.remove(9)
        ll.travel()
        ll.remove(200)
        ll.travel()
    
    效果:
    True
    0
    False
    1
    9 8 1 2 3 4 5 6 
    9 8 1 100 2 3 4 5 6 
    9 8 1 100 2 3 4 5 6 200 
    9 8 1 2 3 4 5 6 200 
    8 1 2 3 4 5 6 200 
    8 1 2 3 4 5 6 
    

    相关文章

      网友评论

          本文标题:2018-07-01链表概念和编程实现

          本文链接:https://www.haomeiwen.com/subject/cvocuftx.html