Python链表的实现

数据结构是程序员的必修课程,大学期间学习的数据结构大都为C语言版的,这里是用python对链表的实现,代码均为自己的理解,在此期间遇到很多问题经过改正受益良多。

代码实现:

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

    def __str__(self):
        return self.data


# 链表类
class LinkList:
    def __init__(self):
        self.length = 0
        self.head = None
    
    # 创建链表
    def creat(self):
        self.head = Node(None)
    
    # 判断链表是否为空
    def is_empty(self):
        if self.head is None:
            return True
        else:
            return False
    
    # 清空链表
    def clear_list(self):
        self.length = 0
        self.head = None

    # 在尾部添加节点
    def append(self, this_node):
        if self.is_empty():
            self.head.next = this_node
        else:
            node = self.head
            while node.next:
                node = node.next
            node.next = this_node
        self.length += 1
    
    # 删除尾部节点
    def remove(self):
        if self.is_empty():
            print('链表为空')
            return False
        else:
            node = self.head
            while node.next:
                node = node.next
                if node.next.next is None:
                    node.next = None
        self.length -= 1
    
    # 获取链表长度
    def get_length(self):
        print(self.length)
    
    # 插入节点
    def insert(self, position, this_node):
        if position == 1 and self.length == 0:
            self.append(this_node)
        if position > self.length:
            print('超出链表长度')
            return False
        else:
            index = 0
            node = self.head
            while node.next:
                index += 1
                if index == position:
                    this_node.next = node.next
                    node.next = this_node
                    self.length += 1
                    return True
                node = node.next
    
    # 按在链表中的位置删除节点
    def delete_by_position(self, position):
        if self.is_empty():
            print('列表为空')
            return False
        else:
            if position > self.length:
                print('超过链表长度')
                return False
            index = 0
            node = self.head
            while node.next:
                index += 1
                if index == position:
                    node.next = node.next.next
                    self.length -= 1
                    return True
                node = node.next
    
    # 按值删除节点
    def delete_by_value(self, value):
        if self.is_empty():
            print('列表为空')
            return False
        else:
            node = self.head
            while node.next:
                if node.next.data == value:
                    node.next = node.next.next
                    self.length -= 1
                    return True
                node = node.next
            print('此值不在链表中')
            return False
        
    # 对链表进行遍历
    def traverse(self):
        if self.is_empty():
            print("链表为空")
            return False
        else:
            node = self.head
            print(node.data, end='')
            while node.next:
                node = node.next
                print("--> {}".format(node.data), end='')
            print()
            return True


Test_List = LinkList()
Node1 = Node(1)
Node2 = Node(2)
Node3 = Node(3)
# 初始化空链表
Test_List.creat()
# 添加节点
Test_List.append(Node1)
Test_List.append(Node2)
Test_List.append(Node3)
# 测试
Test_List.traverse()
Test_List.insert(2, Node('test'))
Test_List.traverse()
Test_List.delete_by_position(4)
Test_List.traverse()
Test_List.delete_by_value('test')
Test_List.traverse()

经测试,以上功能皆可实现。

还有一些例如修改节点的值,查找节点位置等操作均是在以上基础上稍加修改即可。

猜你喜欢

转载自blog.csdn.net/Kevin_Pei/article/details/80352356
今日推荐