算法题总结 —— 链表
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 }
(这道题也可以使用辅助栈的方法)
值得注意的是,我们通常还需要一个临时指针变量来保存主指针(因为主指针一般是先更新,再进行题目所需的操作)