美文网首页
关于链表的一些

关于链表的一些

作者: 小小杨树 | 来源:发表于2021-09-30 10:53 被阅读0次

反转链表

需要考虑空链表,只有一个结点的链表
def reverse_link(head):
    if not head or not head.next:
        return head
    then = head.next
    head.next = None
    last = then.next
    while then:
        then.next = head
        head = then
        then = last
        if then:
            last = then.next
    return head


class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


class Nodes(object):
    def __init__(self, values=None):
        self.nodes = self._set_link(values) if values else None

    def get_link(self):
        return self.nodes

    def print_self(self):
        Nodes.print_link(self.nodes)

    @staticmethod
    def print_link(link=None):
        count = 1
        while link:
            if count == 1:
                print (link.val),
            elif count % 5 == 0:
                print (link.val)
            else:
                print(link.val) ,
            count += 1
            link = link.next


    def _set_link(self, values):
        head = ListNode(0)
        move = head
        try:
            for val in values:
                tmp = ListNode(val)
                move.next = tmp
                move = move.next
        except Exception as e:
            print (e)
        return head.next


if __name__ == '__main__':
    nodes = Nodes([7, 8, 9])
    link = nodes.get_link()
    nodes.print_self()
    head = reverse_link(link)
    nodes.nodes = head
    Nodes.print_link(head)
    nodes.print_self()

结果展示:

7
8
9
9
8
7
9
8
7

————————————————————————————————————————————————————————————————————————————

从尾到头打印单链表

思路1:使用栈 思路2:递归

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


class Link(object):

    @staticmethod
    def link(values):
        head = ListNode(0)
        move = head
        try:
            for val in values:
                tmp = ListNode(val)
                move.next = tmp
                move = move.next
        except Exception as e:
            print (e)
        return head.next


def print_links(links):
    stack = []
    while links:
        stack.append(links.val)
        links = links.next
    while stack:
        print (stack.pop())


def print_link_recursion(links):
    if links:
        print_link_recursion(links.next)
        print (links.val)


if __name__ == '__main__':
    head = Link.link([1, 2, 3, 4, 5, 6])
    print_link_recursion(head)

结果展示:

6
5
4
3
2
1

——————————————————————————————————————————————————————————————————

复杂链表的复制

链表中除了指向后一个结点的指针之外,还有一个指针指向任意结点

分为三步完成:

一.复制每个结点,并把新结点放在老结点后面,如1->2,复制为1->1->2->2
二.为每个新结点设置other指针
三.把复制后的结点链表拆开
import random


class Node(object):

    def __init__(self, val):
        self.val = val
        self.next = None
        self.other = None


class Solution(object):

    @staticmethod
    def clone_nodes(head):
        # 结点复制
        move = head
        while move:
            tmp = Node(move.val)
            tmp.next = move.next
            move.next = tmp
            move = tmp.next
        return head

    @staticmethod
    def set_nodes(head):
        # other指针设置
        move = head
        while move:
            m_next = move.next
            if move.other:
                m_next.other = move.other.next
            move = m_next.next
        return head

    @staticmethod
    def reconstruct_nodes(head):
        # 结点拆分
        ret = head.next if head else Node
        move = ret
        while head:
            head = move.next
            if head:
                move.next = head.next
                move = move.next
        return ret

    @staticmethod
    def clone_link(head):
        # 结果
        h = Solution.clone_nodes(head)
        h = Solution.set_nodes(h)
        ret = Solution.reconstruct_nodes(h)
        return ret

    @staticmethod
    def print_nodes(head):
        # 打印结点值,结点other的值,用来比较
        ret = []
        while head:
            tmp = [head.val]
            if head.other:
                tmp.append(head.other.val)
            ret.append(tmp)
            head = head.next
        print(ret)

    @staticmethod
    def construct_nodes(vals):
        """
        构造一个简单的复杂链表
        :param vals: list
        :return: Nodes
        """
        if not vals:
            return Node
        move = head = Node(vals.pop(0))
        nodes = [None, head]
        for v in vals:
            tmp = Node(v)
            move.next = tmp
            nodes.append(tmp)
            move = move.next
        # print [node.val for node in nodes if node]
        move = head
        while move:
            # 设置other指针为随机结点
            move.other = random.choice(nodes)
            move = move.next
        return head


if __name__ == '__main__':
    link = Solution.construct_nodes([1, 3, 5, 7, 9])
    Solution.print_nodes(link)
    test = Solution.clone_link(link)  # 复制
    Solution.print_nodes(test)

结果展示:

[[1, 1], [3], [5, 1], [7, 3], [9]]
[[1, 1], [3], [5, 1], [7, 3], [9]]

相关文章

  • 关于链表的一些

    反转链表 需要考虑空链表,只有一个结点的链表 结果展示: ————————————————————————————...

  • # 数据结构之循环链表(四)

    在上一篇博客中,我讲了有关于单循环链表的一些基本操作。在这篇博客中,我来讲述一下双向链表和双向循环链表。 循环链表...

  • 链表,单链表

    关于链表的一些知识 ifndef LINKLIST_H define LINKLIST_H typedef voi...

  • 反转链表、环形链表和删除某一个节点

    反转链表、环形链表和删除某一个节点 查看关于网上的一些反转链表的思路,发现步骤十分复杂,在学习了小码哥的数据结构以...

  • 关于链表一些有趣的东西

    今天刷题的时候遇见了这个问题 题目出自leetcode 21:合并两个有序链表 将两个有序链表合并为一个新的有序...

  • 链表——基本的思想和经典问题解决思路

    摘要 本文是一些刷题笔记。梳理链表的问题常见的一些手段。如翻转链表,合并链表,环形链表等等 写在最前面的话 做题目...

  • Redis底层数据结构之双端链表

    前言 Redis的双端链表是基于双向链表实现的,但传统双向链表存在一些问题,比如获取链表长度需要遍历整个链表,时间...

  • 《剑指offer》链表专题

    链表 记录《剑指offer》中所有关于链表的题目,以及LeetCode中的相似题目 相关题目列表 题目 链表是面试...

  • 关于链表的一些逻辑思维

    写这个东西的原因 大学也即将毕业了,很多算法和数据结构的东西可能在iOS开发中并不能用得上,曾经有颗去BAT的心,...

  • 关于链表与HashMap的一些理解

    一.链表 1.创建链表对象,链表通常包含键Key,值Value和下一个链表对象的引用 2.链表的使用 3.链表的数...

网友评论

      本文标题:关于链表的一些

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