近期闲来无事,写个链表压压惊

近期忙着复习期末考试,没咋写代码,这不刷题的时候刷到了一道题,需要一点面线对象和单链表的知识,我就想,不如写一个单链表,顺带复习一下以前的知识点。

话不多说,直接上代码:

class LinkNode(object):  # 结点类
    def __init__(self):  # 默认构造函数
        self.Data = 0
        self.next = None


class SingleLinkList(object):  # 单链表类
    def __init__(self):  # 默认构造函数
        self.Header = LinkNode()  # 首结点
        self.Tail = None   # 尾结点
        self.len = 0
        self.Header.Data = self.len  # 利用空的header.data域存放链表长度

    def __del__(self):  # 析构函数
        print('Destructor call !!!')

    def init_single_linklist(self):  # 初始化单链表
        self.Header.next = None
        self.Tail = None
        self.Header.Data = 0
        self.len = 0

    def is_empty(self):  # 判断单链表是不是非空
        if self.len <= 0:
            return True
        else:
            return False

    def length_single_linklist(self):  # 返回链表的长度
        return self.len

    def add_list(self, li):   # 在链表的后面添加一个列表,成为单链表
        for i in li:
            self.add_element_end(i)
        return True

    def clear_single_linklist(self):  # 清除链表的所有元素
        if self.is_empty():
            print('链表是空的,无法删除!!!')
            return False
        pointer = self.Header
        while pointer.next is not None:
            pointer = pointer.next
            del pointer.Data
        self.Header.next = None
        self.len = 0
        return True

    def destroy_single_linklist(self):  # 销毁单链表
        self.clear_single_linklist()
        del self.Header
        print('销毁单链表成功!!!')

    def add_element_head(self, a):  # 在链表的头部插入一个元素
        a_node = LinkNode()  # 新建一个结点
        a_node.Data = a  # 将这个结点的值赋值为用户传入的值
        pointer = self.Header
        if self.len == 0:
            a_node.next = None
            pointer.next = a_node
        else:
            a_node.next = pointer.next
            pointer.next = a_node
        self.len += 1
        return a

    def add_element_middle(self, pos, b):
        # 在链表的中间(第pos个位置后面,
        # pos不是偏移,而是从1开始的绝对位置)插入一个元素
        # 1 <= pos <= len
        if self.len in [0, 1]:
            print('这个链表的长度不足2,所以在链表进行尾部加入元素')
            self.add_element_end(b)
            return b
        if pos < 1 or pos >= self.len:
            print('您输入的位置超过了范围!')
            return False
        b_node = LinkNode()
        b_node.Data = b
        pointer = self.Header
        for i in range(0, pos):
            pointer = pointer.next
        b_node.next = pointer.next
        pointer.next = b_node
        self.len += 1
        return b

    def add_element_end(self, c):  # 在链表的尾部插入一个元素
        pointer = self.Header
        while pointer.next is not None:
            pointer = pointer.next
        c_node = LinkNode()
        c_node.Data = c
        c_node.next = None
        pointer.next = c_node
        self.len += 1
        return c

    def get_offset(self, e):  # 找某个元素的偏移量
        if self.is_empty():
            print('单链表是空的,没有元素')
        pointer = self.Header
        if pointer.next.Data == e:
            return 0
        i = 0
        while pointer.next is not None:
            pointer = pointer.next
            i += 1
            if pointer.Data == e:
                return i - 1
            if i > self.len:
                break
        return False

    def get_element(self, pos):  # 查找链表中第pos个位置的元素(pos为绝对位置,从1开始计数)
        if self.is_empty() or pos < 1 or pos > self.len:
            print('单链表为空或者您输入的数据超出范围!!!')
            return False
        pointer = self.Header
        for i in range(0, pos):
            pointer = pointer.next
        return pointer.Data

    def precursor_element(self, e):  # 寻找e的前驱元素
        if self.is_empty():
            print('单链表是空的,没有元素')
            return False
        pointer1 = self.Header.next
        pointer2 = self.Header
        if self.len == 1:
            print('您的单链表只有一个元素,不能找到前驱元素!!!')
        if pointer1.Data == e:
            print('您所要找的元素在单链表中是第一个元素,没有前驱元素!!!')
            return False
        i = 0
        while pointer1.next is not None:
            pointer2 = pointer2.next
            pointer1 = pointer1.next
            if pointer1.Data == e:
                i = 1
                return pointer2.Data
        if i == 0:
            print('找不到您要查找的元素!!!')
            return False

    def successor_element(self, e):  # 寻找e的后继元素
        if self.is_empty():
            print('单链表是空的,没有元素')
            return False
        pointer3 = self.Header.next
        pointer4 = self.Header
        if pointer3.Data == e:
            if pointer3.next is not None:
                return pointer3.next.Data
            else:
                print('您的单链表只有一个元素,不能找到后继元素!!!')
                return False
        i = 0
        while pointer3.next is not None:
            pointer4 = pointer4.next
            pointer3 = pointer3.next
            if pointer4.Data == e:
                i = 1
                return pointer3.Data
        if pointer3.next is None and pointer3.Data == e:
            print('您要找的元素的前驱元素是最后一个元素,没有后继元素!!!')
        if i == 0:
            print('不存在你要找的元素!!!')
            return False

    # 这个函数有问题,需要再改进
    # def delete_element(self, e):  # 删除一个元素
    #     if self.is_empty():
    #         print('单链表是空的!!!')
    #         return False
    #     pointer = self.Header
    #     pointer_temp = self.Header.next
    #     i = 0
    #     while pointer_temp.next is not None:
    #         pointer_temp = pointer_temp.next
    #         pointer = pointer.next
    #         if pointer_temp.Data == e:
    #             q = pointer.next
    #             pointer.next = q.next
    #             q.next = None
    #             del q.Data
    #             i = 1
    #             self.len -= 1
    #             break
    #     if i == 0:
    #         print('没有你所要找的数据!!!')
    #         return False
    #     return e

    def delete_element_offset(self, pos):  # 删除一个位置的元素
        if self.is_empty():
            print('单链表是空的!!!')
            return False
        if pos < 1 or pos > self.len:
            print('超过了范围!!!')
            return False
        pointer = self.Header
        for i in range(0, pos):
            pointer = pointer.next
        q = pointer.next
        pointer.next = q.next
        q.next = None
        del q.Data
        self.len -= 1

    def traverse_single_linklist(self):  # 遍历单链表
        if self.is_empty():
            print('链表是空的!!!')
            return False
        pointer = self.Header
        print('Header ->', end=' ')
        while pointer.next is not None:
            pointer = pointer.next
            print(pointer.Data, end=' -> ')
        print('None')
        return True


# 测试单链表
def main():
    x = SingleLinkList()
    # x.init_single_linklist()
    # print('现在链表的长度是:{}'.format(x.length_single_linklist()))
    # print('链表是空的:{}'.format(x.is_empty()))
    # print('下面进行添加链表元素:')
    x.add_list([2, 5, 6, 0, 8, 9, 10, 15])
    # x.add_element_end(2)
    # x.add_element_head(5)
    # x.add_element_head(4)
    # x.add_element_end(3)
    # x.add_element_middle(5, 20)
    # print('现在链表的长度是:{}'.format(x.length_single_linklist()))
    # print('下面遍历链表:')
    # x.traverse_single_linklist()
    # x.clear_single_linklist()
    # x.traverse_single_linklist()
    # print('现在链表的长度是:{}'.format(x.length_single_linklist()))
    # print('链表是空的:{}'.format(x.is_empty()))
    # x.traverse_single_linklist()
    # x.destroy_single_linklist()
    x.traverse_single_linklist()
    # print(x.get_offset(15))
    # print(x.get_element(7))
    # print(x.precursor_element(17))
    # print(x.successor_element(151))
    # x.delete_element_offset(3)
    # x.delete_element(2)
    x.delete_element_offset(5)
    x.traverse_single_linklist()


if __name__ == '__main__':
    main()

用这些代码去应付老师下发的链表作业完全足够了。(doge)

代码如有不懂得小朋友可以私信我,一起讨论,增强能力。

本人能力有限,代码难免有诸多疏漏之处,如遇错误还请批评指正,大家一起进步呀!

欢迎各位码友点赞、收藏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值