python单链表代码实现

本文介绍了Python中单链表数据结构的实现,包括头部插入、尾部追加、按值插入、删除、反转及检测环等操作。此外,还提供了优化后的版本,支持按索引插入、获取、删除节点等功能。代码示例展示了如何交互式地操作单链表。
摘要由CSDN通过智能技术生成
  • 单链表是一种链式数据结构,物理存储方式是随机存储,访问方式是顺序访问
  • 查找链表节点的时间复杂度是O(n)
  • 不考虑插入、删除之前的查找节点的过程,插入、删除的时间复杂度是O(1)

下面为实现代码:

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


class SingleLink(object):
    def __init__(self):
        self.head = Node()

    def is_empty(self):
    	'''判断链表是否为空'''
        return False if (self.head and self.head.value) else True

    def add(self, value):
    	'''链表头部添加节点'''
        new_node = Node(value)
        if self.is_empty():
            self.head = new_node
        else:
            new_node.next = self.head
            self.head = new_node

    def append(self, value):
   		'''链表尾部追加节点'''
        new_node = Node(value)
        if self.is_empty():
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node

    def insert(self, data, value):
    	'''找到val值为data的节点,在其后面插入新节点'''
        if self.is_empty():
            print('找不到要查询的数据,当前链表为空')
            return False
        else:
            current = self.head
            while True:
                if current.value == data:
                    new_node = Node(value)
                    new_node.next = current.next
                    current.next = new_node
                    break
                elif current.next is None:
                    print('找不到要查询的数据')
                    break
                else:
                    current = current.next

    def remove(self, value):
    	'''删除val值为value值的节点'''
        if self.is_empty():
            print('链表为空')
            return False
        else:
            current = self.head
            pre = None
            while True:
                if current.value == value:
                    if pre is None:
                        self.head = current.next
                    else:
                        pre.next = current.next
                    break
                elif current.next is None:
                    print('找不到要删除的数据')
                    break
                else:
                    pre = current
                    current = current.next

    def travel(self):
    	'''遍历返回链表数据'''
        if not self.is_empty():
            current = self.head
            link = ""
            while current.next:
                link += str(current.value)+" "
                current = current.next
            link += str(current.value)
            return link

    def reversal(self):
    	'''反转链表'''
        if self.is_empty():
            print('链表为空')
            return False
        else:
            head = self.head
            new_link = None
            while head is not None:
                next = head.next
                head.next = new_link
                new_link = head
                head = next
            self.head = new_link

    def has_cycle(self):
        """是否有环的存在"""
        slow, fast = self.head, self.head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                return True
        return False

if __name__ == '__main__':
    list = SingleLink()
    print("\n——————当前链表是否为空:", list.is_empty())
    message = ''
    while message != 'q':
        print('''
          ************************************************************************************************************
          **********************************************请选择相应的序号完成相应的操作*************************************
          ************************************************************************************************************   
          **         q、退出操作!!!!!!                                                                           ***
          **         1、从头部插入值!                                                                                ***
          **         2、从尾部插入值!                                                                                ***
          **         3、在指定数据后插入值!                                                                           ***
          **         4、删除操作!                                                                                   ***
          **         5、反转链表!                                                                                   ***          
          ************************************************************************************************************
          ''')
        message = input('——————输入下一步要进行的相应操作序号——————:')
        if message == 'q':
            break
        print("——————操作前链表数据:", list.travel())
        if message == '1':
            value = input('——————请输入要插入的数据:')
            list.add(value)
        elif message == '2':
            value = input('——————请输入要插入的数据:')
            list.append(value)
        elif message == '3':
            data = input('——————请输入指定数据值:')
            value = input('——————请输入要插入的数据:')
            list.insert(data, value)
        elif message == '4':
            value = input('——————请输入要删除的数据:')
            list.remove(value)
        elif message == '5':
            list.reversal()
        elif message == '6':
            print("——————操作前链表数据:", list.find_cycle_middle_node())
        print("——————操作后链表数据:", list.travel())

代码运行截图:
单链表python代码实现

Python单链表优化第二版:

1、从头部插入值!
2、从尾部插入值!
3、在指定index下标插入值!
4、获取指定index下标的节点值!
5、删除指定index下标节点!

class Node(object):

    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next


class SingleLink(object):

    def __init__(self):
        self.head = Node()
        self.size = 0

    def get(self, index):
        """获取节点"""
        index = int(index)
        if index < 0 or index >= self.size:
            print('——————超出链表节点范围')
            return False

        current = self.head
        for i in range(index+1):
            current = current.next
        print('——————获取到数据:',current.val)

    def add(self, val):
        '''从头部开始添加节点'''
        self.add_at_index(0, val)

    def append(self, val):
    	'''链表尾部追加节点'''
        self.add_at_index(self.size, val)

    def add_at_index(self, index, val):
    	'''根据下标index位置添加节点数据'''
        index = int(index)
        if index < 0 or index > self.size:
            print('——————超出链表节点范围')
            return False
        self.size += 1
        pre = self.head
        for _ in range(index):
            pre = pre.next
        new_node = Node(val)
        new_node.next = pre.next
        pre.next = new_node

    def remove_at_index(self, index):
    	'''根据下标index位置删除节点数据'''
        index = int(index)
        if index >= self.size:
            return False
        if index < 0:
            index = 0

        self.size -= 1
        pred = self.head
        for _ in range(index):
            pred = pred.next

        # 删除节点
        pred.next = pred.next.next

    def travel(self):
        if self.size > 0:
            current = self.head.next
            length = ""
            while current.next:
                length += str(current.val)+" "
                current = current.next
            length += str(current.val)
            return length

    def reversal(self):
        '''反转链表'''
        if self.size == 0:
            print('链表为空')
            return False
        else:
            current = self.head
            pre = None
            while current is not None:
                next = current.next
                current.next = pre
                pre = current
                current = next
            self.head = pre

if __name__ == '__main__':
    list = SingleLink()
    message = ''
    while message != 'q':
        print('''
          ************************************************************************************************************
          **********************************************请选择相应的序号完成相应的操作*************************************
          ************************************************************************************************************   
          **         q、退出操作!!!!!!                                                                           ***
          **         1、从头部插入值!                                                                                ***
          **         2、从尾部插入值!                                                                                ***
          **         3、在指定index下标后插入值!                                                                      ***
          **         4、获取指定index下标的值!                                                                        ***
          **         5、删除指定index下标节点!                                                                        ***
          *************************************************************************************************************
          ''')
        message = input('——————输入下一步要进行的相应操作序号——————:')
        if message == 'q':
            break
        print("——————操作前链表数据:", list.travel())
        if message == '1':
            value = input('——————从头部插入值:')
            list.add(value)
        elif message == '2':
            value = input('——————从尾部插入值:')
            list.append(value)
        elif message == '3':
            data = input('——————请输入指定下标index:')
            value = input('——————请输入要插入的数据:')
            list.add_at_index(data, value)
        elif message == '4':
            value = input('——————请输入要获取的数据下标index:')
            list.get(value)
        elif message == '5':
            value = input('——————请输入要删除的下标index:')
            list.remove_at_index(value)
        print("——————操作后链表数据:", list.travel())

最后上一张单链表基本操作图,有兴趣的朋友可以看看:
单链表与单链表基本操作流程图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值