【算法】链表系列知识点汇总(8)

    技术2025-06-01  19

    知识点:链表

    目录:

    【剑指offer】3.从尾到头打印链表 【剑指Offer】14.用两个指针输出链表中倒数第k个结点 【剑指Offer】15.用循环法和递归法反转链表(Python实现) 【剑指Offer】16.合并两个排序的链表 【剑指Offer】25.Python实现复杂链表的复制 【剑指Offer】36. Python实现两个链表的第一个公共结点 【剑指Offer】55. Python实现链表中环的入口结点 【剑指Offer】56. Python实现删除链表中重复的结点

    思路:

    3.从尾到头打印链表

    思路: 新建一个列表,由于listNode是一个列表,所以将listNode的头节点储存到该列表中,然后将该列表反转,返回反转后的列表。

    14.用两个指针输出链表中倒数第k个结点

    思路: 设置两个指针: left,right ,先让 right 走 k-1步,然后再一起走,直到 right 为最后一个 时,left 即为倒数第k个节点 。

    15. 反转链表

    思路: 题目所给的是单链表,反转后:

    最后一个结点指向倒数第二个,倒数第二个指向倒数第三个,…,第二个指向第一个,第一个指向 null ;

    所以需要开始调整每个结点的 next 指针,即把结点挨个从链表上摘下来,做调整;这个调整过程需要两个指针辅助:pre 记录其前一个结点位置,好让该结点的next指针指向前一个结点,但是在指向前一个结点前需要用一个指针p记录后一个结点地址,避免结点丢失。

    16.合并两个排序的链表

    思路: 将两个链表结点挨个进行比较,插入到一个新表中。

    25. 复杂链表的复制

    思路: 对于复杂链表的复制,如果头节点为空,返回None。使用递归法新建一个链表newNode,newNode的值为pHead的label的值,newNode的next指针递归,newNode的随机值指向pHead的random值。

    36. 两个链表的第一个公共结点

    思路: 如果两个链表有公共节点,那么公共节点出现在两个链表的尾部。如果从两个链表的尾部开始往前比较,那么最后一个相同的节点就是第一个公共结点。

    单向链表只能从头节点开始按顺序遍历,最后才能到达尾节点。

    所以需要利用 两个列表 辅助操作,具体操作如下:

    分别把两个链表的节点放入到两个列表里,这样两个链表的尾节点就位于两个列表的尾部,接下来比较两个列表的尾元素是否相同。如果相同,则把列表的尾元素弹出接着比较下一个尾元素,直到找到最后一个相同的节点。

    55. Python实现链表中环的入口结点

    思路: 新建一个空列表,将链表中的节点存入到列表中。如果该节点已经存入到列表中,说明该节点是该链表的环的入口结点。

    56. Python实现删除链表中重复的结点

    思路: 构建一个指针,记录当前头节点pHead的上一个节点,当pHead的值与pHead指向的节点的值相同时,遍历链表,直到节点的值不同,将last.next指向pHead(last.next = pHead)。当pHead的值与pHead指向的节点的值不同时,last指向pHead(last = pHead),继续遍历链表(pHead = pHead.next)。

    Processed: 0.013, SQL: 9