https://www.cnblogs.com/Frank-Hong/p/13488339.html
问题
处理链表问题有时候会用到哑元。那么什么时候需要哑元什么时候可以不需要呢?
回答
当处理head节点和处理其余节点需要用到不同做法时(因为head前面没有节点),为了统一做法需要用到哑元。
示例
(1)以单链表节点删除问题为例:
模型:1 -> 2 -> 3 -> 4
删除节点2,3,4,只需要遍历时保存下待删除节点的前驱节点,然后修改前驱节点的next就好了,可是删除首元节点1时还需要判断是否是该节点是否是head指向的节点,如果是就还要移动head指针指向新的首元节点.
dummy -> 1 -> 2 -> 3 -> 4
而引入了哑元节点,对于1的删除也可以和后面的2,3,4的操作一样了,这样可以不用做边界条件判断
(2)以链表节点顺序交换问题为例:
链表节点顺序交换问题一般需要三个指针。
两两交换问题
见 24.两两交换链表中的节点
模型:pre->l1->l2->rest (l1,l2为待交换的两个结点)
很明显,交换头两个节点和交换其它相邻两个节点用到的方法是不同的,因而需要用到哑元。如果不用哑元而交换头两个节点又用相同方法,则由于待交换节点是从头两个节点开始的,而head之前又没有节点,那么pre就没有意义。
(3)链表反转问题
见 206.反转链表
只需要将操作节点插入到head之前即可,根本不需要操作head,因此不需要用到哑元。
总结
总结上述问题也可以得到另一种角度的解释:当操作节点从head开始,而进行操作时又需要用到操作节点的前一个节点pre时,此时为了使pre有意义需要用到哑元。