python实现单向链表

安稳与你 提交于 2020-01-19 16:05:41
# 节点类
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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!