Loading

链表题目

题目1

单链表是否为回文结构

方案一: 容器 (牺牲空间复杂度)

把这些元素从头开始放到栈中,结束以后依次弹出与第一个数相比较

方案二: 快慢指针

快指针一次走两步,慢指针一次走一步,当快指针为null时,我们找到了链表的尾部以及链表中间的位置

此时将中间位置的结点指向空,反转链表的右半部分,然后双指针,对比完将链表恢复

如果链表的结点为偶数,当快指针跳出时,慢指针就不动了,此时慢指针指向的就当作中间结点

题目2

将单向链表按某值划分成左边小、中间相等、右边大的形式

方案一: 数组 (牺牲空间复杂度)

遍历链表到数组,之后再使用荷兰国旗

方案二: 使用额外变量

因为需要划分为3个区域,每个区域中设置两个变量分别为:头结点和尾结点,接下来遍历原链表,头结点和尾结点指向第一次符合要求的结点,之后将第一个符合要求的元素指向第二个符合要求的结点,将尾结点指向第二个结点,以此类推,最后将第一个区域的尾结点指向第二个区域的头结点,第二个区域的尾结点指向第三个区域的头结点。

复制含有随机指针的结点

方案一: 哈希表

遍历一遍老链表,将老链表的结点映射到map的key,结束后再遍历老链表得到老链表的next和random,映射到map的value

方案二: 另一种摆放位置

遍历一遍链表后,将新结点放在每一个相对应的老结点的后面,利用一个新的结构的摆放,来代替哈希表,方便查找新结点的位置,再遍历老结点,新结点的random指向的是老结点random的下一个结点,即克隆结点相对应的结点。

两个单链表相交的一系列问题

链表是否有环

方案一: 哈希表

遍历链表并且set到map中,如果后续发现遍历的链表map中有,则链表是有环的,如果遍历到空,没有发现,则说明没有环

方案二: 快慢指针

  • 快慢指针从头部出发,快指针一次走两步,慢指针一次走一步
  • 如果快指针null,则无环; 如果一直没遇到null,则有环,如果有环,快指针则会在环上遇到慢指针
  • 遇到后:快指针回到头部,一次走一步,慢指针在原地开始一次走一步
  • 当两者再次遇到时,就是环的入口

两链表相交的问题

头结点分别为head1,head2

分别取得两链表的入环结点loop1 loop2

方案一: 哈希表

将链表一注册到哈希表,再遍历链表二

方案二:

遍历链表一,找到他的最后一个结点,并统计长度;链表二同上。如果两个链表相交,那么他们最后一个结点内存地址一定相同。如果相同,那么这是他们相交部分最后一个结点,那怎么求第一个相交结点呢?让长链表先走,直到剩下的和短链表的长度相同,两链表再一起走

反转链表

迭代

自己申请三个指针:
cur:指向头结点
pre:指向空结点
tem:因为反转链表时链表会断开,所以我们需要一个指针暂存断开的位置,即 cur.next

ListNode pre = null;
        ListNode cur = head;
        ListNode tmp = null;
        while(cur!=null) {
            //记录当前节点的下一个节点
            tmp = cur.next;
            //然后将当前节点指向pre
            cur.next = pre;
            //pre和cur节点都前进一位
            pre = cur;
            cur = tmp;
        }
posted @ 2021-10-17 21:38  Zhbeii  阅读(29)  评论(0编辑  收藏  举报