美文网首页
python3实现单向链表

python3实现单向链表

作者: 前端艾希 | 来源:发表于2019-06-08 18:47 被阅读0次

python3实现单向链表

最近重学数据结构,无奈c语言已经忘得一干二净,所以干脆用python来写。

一、代码结构:

  • 节点类

  • 单向列表类

    • 链表初始化操作

      • init   初始化链表

        • is_empty  判断链表是否为空

        • get_len   获取链表的长度

        • clear_list  清除列表

      • 增加节点

        • append   从链表尾部添加节点

        • insert   在链表的任意位置插入节点

      • 删除节点

        • remove   删除节点内容 为data的所有节点

        • pop     删除第i个节点并且返回节点的内容

        • 查看节点

        • get_data 查看第i个节点的内容

二、代码详情

#-*- coding:utf-8 -*-
#Author: Bing Xu

class Node(object):
    def __init__(self,data):
        self.data = data
        self.next = None

class Single_Linklist(object):
    def __init__(self):
        '''
        链表初始化
        '''
        self.head_node = None

    def is_empty(self):
        '''
        判断链表是否为空
        :return:
        '''
        return self.head_node == None

    def get_len(self):
        '''
        获取链表对象的长度
        :return: 链表长度
        '''
        counter = 0
        cur = self.head_node
        while cur:
            counter += 1
            cur = cur.next
        return counter

    def clear_list(self):
        '''
        清除链表所有元素
        :return: 空链表
        '''
        self.head_node = None

    def append(self,data):
        '''
        链表尾部追加节点
        :param data: 追加节点的内容
        :return:
        '''
        node = Node(data)
        if self.is_empty():
            self.head_node = node
        else:
            cur = self.head_node
            while cur.next:
                cur = cur.next
            cur.next = node

    def insert(self,i,data):
        '''
        插入新的节点
        :param i: 待插入的位置,0 <= i <= self.length
        :param data: 待插入的节点数据
        :return:
        '''
        node = Node(data)
        length = self.get_len()
        cur = self.head_node
        if length >= i:
            if i == 0:
                self.head_node = node
                node.next = cur
            else:
                for item in range(i-1):
                    cur = cur.next
                temp = cur.next
                cur.next = node
                node.next = temp
        else:
            return False

    def remove(self,data):
        '''
        删除链表内容为data的所有节点
        :param data: 要删除的内容
        :return:
        '''
        cur = self.head_node
        if cur.data == data:
            self.head_node = cur.next
            return
        else:
            while cur.next:
                # temp = cur
                # cur = cur.next
                temp,cur = cur,cur.next
                if cur.data == data:
                    temp.next = cur.next

    def pop(self,i):
        '''
        删除链表对象第i个节点并返回该节点内容
        :param i: 要删除的节点,0 <= i < self.length
        :return: 删除节点的内容
        '''
        length = self.get_len()
        cur = self.head_node
        if i == 0:
            Data = cur.data
            self.head_node = cur.next
            return Data
        elif i < length:
            for j in range(i):
                temp, cur = cur, cur.next
            Data = cur.data
            temp.next = cur.next
            return Data

    def reset_data(self,i,data):
        '''
        修改第i个节点的内容
        :param i: 要修改的节点,0 <= i < self.length
        :param data: 修改后的内容
        :return:
        '''
        cur = self.head_node
        if 0 <= i < self.get_len():
            for j in range(i):
                cur = cur.next
            cur.data = data
        else:
            return False

    def get_data(self,i):
       '''
       获取链表第i个的值
       :param i: 0 <= i < self.length
       :return: 节点的内容
       '''
       cur = self.head_node
       if 0 <= i < self.get_len():
           for j in range(i):
               cur = cur.next
           return cur.data
       else:
           return False

三、代码测试

# 链表初始化:
sin_list = Single_Linklist()
print(sin_list.get_len())
print(type(sin_list))

# 结果为:
<class '__main__.Single_Linklist'>

# 增:
for i in range(10):
    sin_list.append(i)
sin_list.insert(0,'insert')

print(sin_list.get_len())
for j in range(sin_list.get_len()): #遍历打印
    print(sin_list.get_data(j),end=',')

# 结果:
insert,0,1,2,3,4,5,6,7,8,9,

# 删
for i in range(10):
    sin_list.append(i)

sin_list.remove(0)
sin_list.pop(sin_list.get_len()-1)

for j in range(sin_list.get_len()):  #遍历打印
    print(sin_list.get_data(j),end=',')

结果:
1,2,3,4,5,6,7,8,

# 改
for i in range(10):
    sin_list.append(i)

sin_list.reset_data(0,'修改')
sin_list.reset_data(9,'完成')

for j in range(sin_list.get_len()): #遍历打印
    print(sin_list.get_data(j),end=',')

结果:
修改,1,2,3,4,5,6,7,8,完成,

相关文章

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • python3实现单向链表

    python3实现单向链表 最近重学数据结构,无奈c语言已经忘得一干二净,所以干脆用python来写。 一、代码结...

  • 链表反转

    概述 链表反转是非常经典的面试题,要实现此功能,需先实现链表的数据结构。 链表类 获得单向链表方法 输出单向链表方...

  • 单向链表反转(含图解)

    前言 上次讲解了单向链表的原理《Java实现单向链表功能》,今天拓展一下实现链表的翻转。下面直接上代码。 链表初始...

  • Java实现有环的单向链表,并判断单向链表是否有环

    Java实现有环的单向链表,并判断单向链表是否有环 有一个单向链表,链表当中有可能出现环,就像下图这样。我们如何判...

  • JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 二. 双向链表 三. 循环链表 练习 一. 实现advance(n)方法,使当前节点向...

  • python 循环单向链表

    单向循环链表python实现 循环链表实现 头节点添加 尾节点添加 插入 删除 查找

网友评论

      本文标题:python3实现单向链表

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