题目一:
链表解题思路:
链表的题目,如果是删除时,都会考虑到头结点的情况,需要特殊考虑。但如果不想特殊考虑的时候,可以在头结点前面,设置一个虚拟头结点dummy结点指向头结点,这样就可以统一处理了。
对于链表的题目,最好是用笔画一画,弄清楚各个指针指向哪些结点,如何变化,循环结束的条件是什么。
解法一:(迭代含虚拟头结点)
解题思路: 这个题目是删除链表中目标值为val的结点,删除结点情况下,需要先保存当前结点的前一个结点,因为删除当前结点,只需要将当前结点的前一个结点的指针,指向当前结点的下一个结点即可,如果使用dummy结点,注意最后返回时,返回的是dummy.next,这才是真正的头结点。
这个题其实还可以不要额外申请空间,如代码所示。
解法二:(迭代不含虚拟头结点)
思路:去掉链表头部值为target的节点,最终得到的列表头是可以返回的; 去掉非链表头部的节点,主要是判断下一个节点(p.next)的值是否为target,如果是的话把当前节点的next指向下下一个节点(p.next.next)。
解法三:(递归)
总结:链表的题都需要好好比划比划,在纸上画一画能更好地理解。递归解法一般都想不到。