算法题总结 —— 链表
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; ... }

浙公网安备 33010602011771号