1、Leecode 203.移除链表元素
题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/
题目描述:
解题思路:移除操作就是让节点next指针直接指向下下一个节点,因为单链表的特殊性,只能指向下一个节点,所以头节点需要单独考虑,这种方法是直接使用原来的链表来进行删除操作,还有一种不单独考虑头节点——设置一个虚拟头结点在进行删除操作。
解法一(单独考虑头节点)
问题:为什么最后函数返回的 head ,是经过调整后的正确链表头指针。
解答:虽然 cur 的改变本身不会直接影响函数外部传入的 head ,但在函数内部,对链表节点的删除操作是围绕 head 所代表的链表结构进行的。当删除节点时,无论是头节点还是非头节点,都通过指针操作(如 cur 的移动及相关指针调整)来重新构建链表结构。当删除完成后,函数内部经过调整的链表头位置,正是 head 当前所指向的位置(若删除了头节点, head 在函数内部已重新指向新的头节点;若未删除头节点, head 指向原头节点且链表结构已完成调整)。最后返回 head ,这个 head 指向的就是经过调整后的正确链表头,能让外部调用函数获取到删除节点后的新链表。
解法二(设置虚拟头结点)
本题视频讲解:https://www.bilibili.com/video/BV18B4y1s7R9/?vd_source=1670197f6caeac56a4d61abf46d4644d
2、Leecode 707.设计链表
题目链接:https://leetcode.cn/problems/design-linked-list/description/
题目描述:
思路:虚拟节点
解答:
3、Leecode 206.反转链表
题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
题目描述:
思路:双指针法——首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。递归写法也严格按照双指针,当cur为空的时候循环结束,不断将cur指向pre的过程。
解法一(双指针)
解法二(递归)