[python单链表]单链表的基础实现

单链表的Python实现

# 结点类
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None


# 单链表
class SingleLinklist:
    def __init__(self, node=None):
        # 头结点定义为私有变量
        self._head = node

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

    def length(self):
        # 返回链表的长度
        # cur游标,用来移动遍历结点
        # count用来计数
        cur = self._head
        count = 0
        while cur:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        # 遍历输出整个链表
        cur = self._head
        while cur:
            print(cur.value, end=' ')
            cur = cur.next
        print()

    def add(self, item):
        # 头部添加一个结点
        node = Node(item)
        if self._head is None:
            self._head = node
        else:
            node.next = self._head
            self._head = node

    def append(self, item):
        # 尾部添加一个结点
        node = Node(item)
        # 若链表为空,直接将该结点作为链表的第一个元素
        if self._head is None:
            self._head = node
        else:
            cur = self._head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

    def insert(self, pos, item):
        # 在指定位置pos添加结点
        # 若指定位置pos为第一个元素之前,则执行头部插入
        if pos <= 0:
            self.add(item)
        # 若指定位置超过链表尾部,则执行尾部插入
        elif pos > self.length():
            self.append(item)
        else:
            pre = self._head
            count = 0
            node = Node(item)
            while count < pos - 1:
                count += 1
                pre = pre.next

            node.next = pre.next
            pre.next = node

    def remove(self, item):
        # 删除一个结点
        # 若链表为空,则直接返回
        if self.is_empty():
            return
        pre = None
        cur = self._head

        while cur:
            # 若没有找到元素,继续按链表后移结点
            if cur.value != item:
                pre = cur
                cur = cur.next
            else:
                # 若要删除的点为头结点
                if cur == self._head:
                    self._head = cur.next
                    break
                else:
                    pre.next = cur.next
                    break

    def search(self, item):
        # 查找结点是否存在
        cur = self._head
        while cur:
            if cur.value == item:
                return True
            else:
                cur = cur.next
        return False


if __name__ == '__main__':
    slink = SingleLinklist()
    print(slink.is_empty())
    print(slink.length())
    slink.append(1)
    slink.append(2)
    slink.append(3)
    slink.append(4)
    slink.travel()
    slink.insert(2, 9)
    slink.travel()
    slink.remove(1)
    slink.travel()

发布了79 篇原创文章 · 获赞 156 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ZHUQIUSHI123/article/details/93979835