数据结构之链表

python实现链表的实现以及增删改查

 

一、链表简介

链表是一种在存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现。链表是由一系列的结点组成,结点可以在运行时动态生成。每个结点包含两部分:数据域与指针域。数据域存储数据元素,指针域存储下一结点的指针

  

二、单向链表

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

单向链表结构

head 保存首地址,item 存储数据,next 指向下一结点地址。

链表失去了序列的随机读取优点,同时链表增加了指针域,空间开销也较大,但它对存储空间的使用要相对灵活。

列如:有一堆数据[1,2,3,5,6,7],要在3和5之间插入4, 如果用数组,需要将5之后的数据都往后退一位,然后再插入4,这样非常麻烦,但是如果用链表,我就直接在3和5之间插入4就行。

 

三 python实现链表的方式

import pdb
class Node(object):
    """链表节点"""
    def __init__(self, item):
        self.item = item
        self.next = None


class SingleLinkList(object):
    """单链表类"""

    def __init__(self):
        self._head = None

    # 判断链表是否为空
    def is_empty(self):
        return self._head is None

    # 统计链表长度
    def length(self):
        cur = self._head
        count = 0
        while cur is not None :
            count += 1
            cur = cur.next
        return count

    # 遍历链表
    def items(self):
        cur = self._head
        while cur is not None:
            yield cur.item
            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():
            self._head = node
        else:
            cur = self._head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

    # 向链表的指定位置添加元素
    def insert(self, index, item):
        node = Node(item)
        length = self.length()
        if length <= 0:
            self._head = node
        elif index > length :
            self.append(item)
        else:
            cur = self._head
            for i in range(1,index):
                cur = cur.next
            node.next = cur.next
            cur.next = node

    # 删除链表中的指定元素
    def remove(self, item):
        cur = self._head
        pre = None
        while cur is not None:
            if cur.item == item:
                if not pre:
                    self._head = cur.next
                else:
                    pre.next = cur.next
                return
            else:
                pre = cur
                cur = cur.next

    # 判断元素是否在链表中
    def find(self,item):
        return item in self.items()

if __name__ == '__main__':
   # pdb.set_trace()
    linkobj = SingleLinkList()
    for i in range(10):
        linkobj.append(i)
    # for node in range(10):
    #    print(node)
    # linkobj.insert(10,11)
    #print(list(linkobj.items()))
    res = linkobj.remove(5)
    print(list(linkobj.items()))

 

posted @ 2022-04-05 20:37  伊铭(netease)  阅读(108)  评论(0编辑  收藏  举报