美文网首页
环形链表

环形链表

作者: 万万二号 | 来源:发表于2019-11-26 16:23 被阅读0次

一、说明

二、代码

三、应用


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


class LoopLink(object):
    def __init__(self, init_list: list):
        """
        初始化
        """
        self._link = None
        self._reverse_link = None
        self._init_link(init_list)

    def _init_link(self, init_list: list):
        init_list.reverse()
        first = None
        for item in init_list:
            self._link = Node(item, self._link)
            if first is None:
                first = self._link
        first.next = self._link

    # def _init_link_2(self):
    #     try:
    #         self._link = Node(next(self._init_list), self._link)
    #         self._init_link()
    #     except:
    #         return

    @property
    def list(self):
        """
        将链表转换成list
        :return:
        """
        res = []
        link = self._link
        item = link.item
        while link:
            res.append(link.item)
            link = link.next
            if link.item == item:
                break
        return res

    def clear(self):
        """
        清空链表
        :return:
        """
        self._link = None

    def pop(self):
        """
        删除最后一个元素
        :return:
        """
        # 获取倒数第二个元素
        node = self.get_node(self.length - 1 - 1)
        node.next = self._link

    def shift(self, length=None):
        """
        删除第一个元素
        :return:
        """
        link = self._link
        if length is None:
            length = self.length
        index = 0
        second_node = link.next
        while link:
            if index >= length - 1:
                link.next = second_node
                self._link = second_node
                break
            link = link.next
            index += 1

    def delete(self, item):
        """
        删除某个元素,删除头元素调用shift()方法
        :param item:
        :return:
        """
        length = self.length
        link = self._link
        index = 0
        prev = None
        while link:
            if link.item == item:
                if index == 0:
                    self.shift(length)
                elif index == length - 1:
                    prev.next = self._link
                else:
                    prev.next = link.next
                break
            if index >= length - 1:
                break
            prev = link
            link = link.next
            index += 1

    def get_index(self, item):
        """
        根据元素获取位置
        :param item:
        :return:
        """
        index = 0
        link = self._link
        while link:
            if link.item == item:
                break
            link = link.next
            index += 1
        return index

    def get_node(self, index):
        """
        根据位置获取元素
        :param index:
        :return:
        """
        _index = 0
        link = self._link
        while link:
            if _index == index:
                break
            link = link.next
            _index += 1
        return link

    def append(self, item):
        """
        在最后的位置添加
        :param item:
        :return:
        """
        first = self._link
        last = self.get_node(self.length-1)
        last.next = Node(item, first)

    def unshift(self, item):
        """
        在第一个位置添加
        :param item:
        :return:
        """
        last = self.get_node(self.length-1)
        self._link = Node(item, self._link)
        last.next = self._link

    def insert(self, item, index):
        """
        向链表的index位置插入元素item
        index从0计数
        :param item:
        :param index:
        :return:
        """
        length = self.length
        if index >= length:
            index = index % length
        if index == 0:
            self.unshift(item)
        elif index == length - 1:
            self.append(item)
        else:
            _index = 0
            link = self._link
            prev = None
            while link:
                if _index == index:
                    prev.next = Node(item, link)
                    break
                prev = link
                link = link.next
                _index += 1

    @property
    def length(self):
        """
        获取链表的长度
        :return:
        """
        return len(self.list)

    def empty(self):
        """
        链表是否为空
        :return:
        """
        if self._link is None:
            return True
        else:
            return False

    def in_link(self, item):
        """
        判断元素是否在链表中
        :param item:
        :return:
        """
        index = 0
        length = self.length
        link = self._link
        while link:
            if item == link.item:
                return True
            if index >= length - 1:
                return False
            link = link.next
            index += 1
        return False


if __name__ == '__main__':
    link = LoopLink(['zhangbo', 'liudong', 'zhuxiang', 'suirun'])
    print(link.list)
    # link.insert('wuxiaokang', 3)
    # print(link.list)
    # print(link.get_index('wuxiaokang'))
    # print(link.get_node(3).item)
    # link.append('hufang')
    # print(link.list)
    # link.unshift('shenming')
    # print(link.list)
    # link.insert('xiaoqiao', 7)
    # print(link.list)
    link.delete('liudong')
    print(link.list)
    # link.delete('suirun')
    # print(link.list)
    # link.reverse()
    # print(link.list)

相关文章

  • 实现单向-双向环形链表

    单向环形链表 双向环形链表

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • 02-14:leetcode重刷8之哈希与数组

    链表: 判断链表是否环形、是否回文 1、是否链表 #Definitionforsingly-linkedlist....

  • Tourist with Data Structure Seco

    链表 读题要仔细,只看题干,容易死的很惨。 设计链表 环形链表 一般环形链表使用快慢指针方式去做,快慢指针算法。参...

  • 算法(Algorithms)第4版 练习 1.3.29

    题目 使用环形链表实现队列(FIFO),环形链表也是链表,只是没有任何一个节点的链接是空的,且只有链表非空则 la...

  • 判断一个链表是否为环形链表

    判断一个链表是否为环形链表 思路:通过检测一个节点此前是否已经被访问过来判断链表是否为环形链表。 算法: 我们遍历...

  • 单项环形链表介绍和约瑟夫问题

    单项环形链表介绍和约瑟夫问题 1.单项环形链表图解 2.Josephu(约瑟夫)问题 Josephu 问题为:设...

  • 链表—环形链表

    给定一个链表,判断链表中是否有环。 分析 由于每一个父亲只有可能有一个孩子,故这里的环实际上是指list中某一个节...

  • 链表——环形链表

    首先,来列一下环形链表的特征: 至少存在一个节点,且有两个指针指向这个节点 链表中有且只有一个环,且这个环一定不能...

  • 链表--环形链表

    目录[https://www.jianshu.com/p/85e18c21317a] 环形链表一[https://...

网友评论

      本文标题:环形链表

      本文链接:https://www.haomeiwen.com/subject/bhcywctx.html