CSDN博客地址

单向链表

直接上代码,如下:

#encoding:utf-8

class Node():
    # 设置节点
    def __init__(self, data=None, next=None):  # 传入值和指针
        self.data = data
        self.next = next

class SingleLinkList():
    def __init__(self):
        self.head = None

    def print(self):
        # 打印列表
        if self.head is None:
            print("LinkedList is empty")   # 空链表
            return
        itr = self.head
        litr = ""    # 初始化链表
        while itr:
            litr += str(itr.data) + "--"   # 拼接链表
            itr = itr.next    # 指针后移
        print(litr)

    def get_length(self):
        # 获取链表长度
        lens = 0
        itr = self.head
        while itr:
            lens += 1
            itr = itr.next
        return lens

    def insert_at_start(self, data):
        node = Node(data, self.head)  # 实例化一个待插入的结点
        self.head = node    # 把实例化的新结点插在头结点上

    def insert_at_end(self, data):
        if self.head is None:
            self.head = Node(data, None)    # #当链表为空时,把实例化的结点做为头结点,注意此时结点也是为尾结点,故指针为None
            return
        itr = self.head
        while itr.next:
            itr = itr.next
        itr.next = Node(data, None)   # 实例化一个结点插到链表尾部

    def insert_at(self, index, data):
        if index < 0 or index > self.get_length():   # 越界
            raise Exception("Invalid Index")
        if index == 0:    # 在第一个位置插入结点
            self.insert_at_start(data)
            return
        count = 0
        itr = self.head
        while itr:
            if count == index - 1:
                node = Node(data, itr.next)   # 实例化一个新的结点,新的结点的指针指向当前itr的下一个结点
                itr.next = node
                break
            itr = itr.next
            count += 1

    def remove_at(self, index):
        if index < 0 or index >= self.get_length():
            raise Exception("Invalid Index")
        if index == 0:
            self.head = self.head.next    # 只需把头结点的指针往后移动一个即可
            return
        count = 0
        itr = self.head
        while itr:
            if count == index - 1:
                itr.next = itr.next.next    # itr的指针指向它的下下个结点
                break
            itr = itr.next
            count += 1

    def insert_values(self, data_list):
        self.head = None
        for data in data_list:
            self.insert_at_end(data)   # 在尾部依次插入


    def insert_after_value(self, data_after, data_to_insert):
        if self.head is None:
            return
        if self.head.data == data_after:
            self.head.next = Node(data_to_insert, self.head.next)
            return
        itr = self.head
        while itr:
            if itr.data == data_after:
                itr.next = Node(data_to_insert, itr.next)
                break
            itr = itr.next

    def remove_by_value(self, data):
        if self.head is None:
            return
        if self.head.data == data:
            self.head = self.head.next
            return
        itr = self.head
        while itr.next:
            if itr.next.data == data:
                itr.next = itr.next.next
                break
            itr = itr.next


ll = SingleLinkList()
ll.insert_values(['aa', 'bb', 'cc', 'dd'])    # 插入一堆元素
ll.insert_at(1, "ee")   # 某一位置插入一个元素
ll.print()    # 打印当前链表    aa--ee--bb--cc--dd--
ll.remove_at(2)     # 删除某一位置元素
ll.print()   # 打印当前链表  aa--ee--cc--dd--

ll2 = SingleLinkList()
ll2.insert_values([1, 2, 3, 4, 5])
ll2.insert_at_end(6)
ll2.print()   # 1--2--3--4--5--6--
posted @ 2020-04-25 20:17  Yi_warmth  阅读(95)  评论(0编辑  收藏  举报
CSDN博客地址