今天学习的是链表相关的问题,移除链表,设计链表和反转链表。
主要练习了一些常见的链表的基本操作。在练习的过程中加深对链表的认识。
如何定义一个链表元素,首先定义一个节点的元素,然后使指针指向下一个节点,没有插入链表时指向NULL。nullptr则表示指针指向NULL,它可能会有值。
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
链表的增删,复杂度为O(1),不影响其它元素
1. 移除链表
链表的基本操作,有两种方法,其一是考虑是否删除头节点,在原链表上进行删除,另一种方法是定义一个指向头节点的虚拟头节点,再进行遍历删除,随后再将虚拟头节点指向的节点赋给头节点,这种方法不用考虑是否删除头节点。
题例 :203 链表删除
2. 设计链表
这道题是设计函数来实现链表的一些基本操作。题目的难度不大,但是具体实现起来需要思考的内容很多,很多地方容易出错,需要多加练习。
题例 :707 设计链表
3. 反转链表
这一题需要着重理解反转链表的过程。实际上反转链表只需要反转指针的方向就能实现。用一个链表的双指针法即可实现。值得注意的是,反转指针始终是一个指向链表元素的空指针,所以当遍历完链表后可以直接return反转指针。递归也是类似的思路。
题例:206 反转链表