用python实现单链表的基本操作

单链表基本操作:

  • 创建链表 (need)
  • 打印链表 (need)
  • 链表总长度
  • 判断链表是否为空
  • 在链表末尾追加元素item
  • 在index位置前插入元素item
  • 删除index位置上的元素

#!usr/bin/env python  
#-*- coding:utf-8 _*
""" 
@author: YAOTIANLONG 
@file: Linklist.py 
@time: 2019/10/22 
"""
class ListNode:
    """单链表结点"""
    def __init__(self, data, next=None):
        self.data = data
        self.next = next


class LinkList:
    """
    单链表基本操作:
        - 创建链表
        - 打印链表
        - 链表总长度
        - 判断链表是否为空
        - 在链表末尾追加元素item
        - 在index位置前插入元素item
        - 删除index位置上的元素
    """
    def __init__(self):
        self.head = None  # self.head为头结点

    def create(self, data):
        """
        创建链表
        :param data: list, 如:[1,2,3]
        :return:
        """
        if not isinstance(data, list) or len(data) == 0:  # 特殊判断:不是列表或者列表为空,退出程序
            return
        self.head = ListNode(data[0])  # 创建头结点
        p = self.head  # 指针p指向头结点,p的类型为None
        for i in data[1:]:  # 在头结点后边依次插入列表剩余结点
            p.next = ListNode(i)
            p = p.next

    def print(self):
        """
        打印链表,以空格分隔,末尾换行
        :return:
        """
        p = self.head
        while p:  # 遍历链表,打印结点值
            print(p.data, end=" ")
            p = p.next
        print()

    def len(self):
        """
        链表长度
        :return: len
        """
        p = self.head
        len = 0
        while p:  # 遍历链表,统计结点个数
            len += 1
            p = p.next
        return len

    def is_empty(self):
        """
        判断链表是否为空
        :return: True or False
        """
        return True if self.len() == 0 else False

    def append(self, item):
        """
        在链表末尾追加元素, 如:[1,2,3] =>append(4)=> [1,2,3,4]
        :param item: 追加元素的值
        :return:
        """
        p = self.head
        while p.next:
            p = p.next  # 找到末尾位置
        p.next = ListNode(item)  # 插入元素

    def insert(self, index, item):
        """
        在链表index位置之前插入元素item, 如:[1,2,3] =>insert(1,4)=> [1,4,2,3]
        :param index: 索引,从0开始
        :param item:  元素的值
        :return:
        """
        if index > self.len() or index < 0:  # 特殊判断,不在列表范围,退出程序
            return
        if index == 0:  # 在第一个位置插入
            self.head = ListNode(item, self.head)
            return
        p = self.head
        n = 0
        while n < (index-1):
            p = p.next
            n += 1  # 找到插入位置
        if index == self.len():
            p.next = ListNode(item)  # 在最后一个位置插入
        else:
            p.next = ListNode(item, p.next)  # 在中间位置插入

    def delete(self, index):
        """
        删除链表index位置上的元素, 如:[1,2,3] =>delete(1)=> [1,3]
        :param index: 索引,从0开始
        :return:
        """
        if index > self.len() or index < 0:  # 特殊判断,不在列表范围,退出程序
            return
        if index == 0:  # 在第一个位置插入
            self.head = self.head.next  # 跳过,删除元素
        else:
            p = self.head
            n = 0
            while n < (index-1):
                p = p.next
                n += 1  # 找到删除位置
            p.next = p.next.next  # 删除元素


if __name__ == "__main__":
    a = LinkList()
    a.create([1, 2, 4, 3, 8, 9])
    a.print()
    print("len:", a.len())
    print("head data:", a.head.data)
    print("LinkList Not None" if not a.is_empty() else "LinkList is None")
    a.append(20)
    a.print()
    a.insert(0, 30)
    a.print()
    a.delete(a.len()-1)
    a.print()
输出结果:
C:\Software\Anaconda3\envs\tf_gpu\python.exe D:/PycharmProjects/DataStruct/Linklist.py
1 2 4 3 8 9 
len: 6
head data: 1
LinkList Not None
1 2 4 3 8 9 20 
30 1 2 4 3 8 9 20 
30 1 2 3 8 9 20 

Process finished with exit code 0
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值