zoukankan      html  css  js  c++  java
  • python实现单向链表

    # 节点类
    class Node:
        def __init__(self, data, next=None):
            self.data = data
            self.next = next
    
        def __str__(self):
            return str(self.data)
    
    # 链表类
    class LinkedList:
    
        def __init__(self):
            self.head = None
            self.length = 0
    
        # 链表尾部append数据
        def append(self, data):
            node = Node(data)
            if self.head is None:  # head 未空,则此时链表为空,直接将新节点赋给self.head
                self.head = node
            else:  # head 不为空
                current = self.head
                index = 0
                while current.next:  # 当前元素的下个元素是否为空
                    current = current.next
                current.next = node
            self.length += 1
    
        # 某一位置插入节点
        def insert(self, pos, data):
            if pos < 0 or pos > self.length:
                raise IndexError
            new_node = Node(data)  # 创建新的节点
            # pos 为 0时
            if pos == 0:  # 插入到第一个位置,因为有head所以需要单独处理
                new_node.next = self.head
                self.head = new_node
                self.length += 1
                return
    
            # pos不为0时
            count = 0  # 记录遍历过的节点数
            previous = None  # 当前节点的前一个节点
            current = self.head  # 当前节点,从第一个节点开始遍历,所以默认为head
            while count < pos:  # 遍历到pos的前一个节点
                count += 1
                previous = current
                current = current.next
            previous.next = new_node # 循环结束后,将新的节点赋给previous.next
            new_node.next = current # 将当前节点赋给 new_node.next
            self.length += 1
    
        # integer -- return first index of value.
        def index(self, value) -> int:
            index = 0
            current = self.head
            while current:
                if current.data == value:
                    return index
                current = current.next
                index += 1
            return -1
    
        # index -> value
        def valueof(self, index):
            count = 0
            current = self.head
            while current:
                if index == count:
                    return current.data
                current = current.next
                count += 1
            return ''
    
        # 移除某一个节点
        def remove(self, value):
            current = self.head
            previous = None
            index = 0
    
            # 分两种情况 1、移除的节点是第一个节点(index=0), 2、移除的节点不是第一个节点(index !=0)
            while current:
                if current.data == value:
                    print('remove')
                    if index == 0:
                        self.head = current.next
                    else:
                        previous.next = current.next
                    return
                previous = current
                current = current.next
    
        def update(self, index, new_value):
            current = self.head
            count = 0
            while current:
                if index == count:
                    current.data = new_value
                    return current.data
                current = current.data
    
        def __str__(self):
            tostr = 'LinkedList { '
            current = self.head
            while current:
                tostr = tostr + str(current) + " "
                current = current.next
            return tostr + '}'
    
    
    # 测试代码
    linklist = LinkedList()
    linklist.append('1')
    linklist.append('2')
    linklist.append('3')
    linklist.append('4')
    linklist.append('5')
    linklist.insert(0, 'a')
    print(linklist)
    print(linklist.length)
    print(linklist.index('3'))
    print(linklist.valueof(1))
    print(linklist)
    linklist.remove('a')
    print(linklist)
    print(linklist.update(0, 'b'))
    print(linklist)
    print(linklist.update(0, 'c'))
    print(linklist)
  • 相关阅读:
    ros 录制
    shell 截取字符串
    Linux 关机
    shell获取字符串长度
    ubuntu14.04 设置开机自启动脚本
    获取本机ip的shell脚本
    shell 杀掉指定进程的服务
    html 绘制矩形轨迹,选中区域
    shell模拟ctrl c停止
    shell 字符串提取数字
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/12213687.html
Copyright © 2011-2022 走看看