算法题总结 —— 链表

1. 辅助栈

  很多时候,在做栈、链表等等题目中,需要使用到辅助栈。比如  剑指 Offer 30. 包含min函数的栈  中,我们需要使用一个辅助栈,只把当前的最小值放在栈顶。经常使用到的函数有:pop出栈,push入栈,peek返回栈顶元素,size返回栈里元素个数。   剑指 Offer 06. 从尾到头打印链表 中,我们也用到了辅助栈,用于先进后出。

2. 两节点法

  当我们需要一个新的链表的时候,我们常常需要定义两个结点:一个 startNode,一个 endNode。其中 startNode一直指向头结点,而endNode则是随着链表的变化而变化,始终指向尾结点。最终返回 startNode,就相当于返回了新链表。

3. 快慢指针

  当链表需要改变next域的时候,我们需要快慢指针因为改变结点的next域后,就不能使用 p = p.next 之类的语句来更新指针位置,因此需要一个指针一直指向另外一个指针的后一个结点,用于主指针的更新。  典型的案例: 剑指 Offer 24. 反转链表  我们定义一个 preNode指针和一个 nextNode指针,nextNode指针一直指向preNode指针的后一个位置。

        ListNode preNode = head;
        ListNode nextNode = head.next;
        while(nextNode!=null){
            ListNode p = preNode; //保存该结点
            preNode = nextNode; //更新前结点
            nextNode = nextNode.next;  //更新下一个结点
            preNode.next = p; //修改next
        }

 

(这道题也可以使用辅助栈的方法)

值得注意的是,我们通常还需要一个临时指针变量来保存主指针(因为主指针一般是先更新,再进行题目所需的操作)

4. 哈希表

  剑指 Offer 35. 复杂链表的复制(已经整理) 中,我们就用到了哈希表来存储旧链表和新链表的对应关系。常用于特殊链表(比如多了个指针域之类的)中,此时生成新结点不能满足题目的要求,我们就需要使用哈希表来对 旧链表和新链表进行映射,然后用 get(旧结点) 函数来获取新链表结点,同时对新链表结点进行修改。 比如  get(旧结点).next = get(旧结点.next)。5.

5. 数组补0

  当我们对两个链表进行结点值相加时,我们可能会遇到两个链表不一样长的情况(比如 2. 两数相加为了便于相加,我们可以在较短的链表遍历完毕后,一直返回0,而不是直接退出while循环

        while(l1!=null||l2!=null){
            //不足的位补0
            int m = (l1==null)?0:l1.val; //遍历完就返回0,没有遍历完就返回值
            int n = (l2==null)?0:l2.val;
            ...
        }

 

posted @ 2022-01-02 23:11  Acc22222222  阅读(42)  评论(0)    收藏  举报