设计链表
1.知识点:
(1)哨兵:
1.关于为什么要建立哨兵节点或者说建立稍兵的目的有啥用呢?
这个问题的话,用专业术语来讲就是1. 简化链表操作的逻辑2. 避免处理空链表的特殊情况3. 减少边界条件的检查。用简单的话来说:就是为了你写代码更简单。
2.这里呢说一下创建哨兵和不带哨兵的区别:
建立哨兵的话需要为哨兵在申请一个空间,值得注意的是,这里哨兵有两种定义:第一种是狭义上的即:哨兵下一个节点为头节点,第二种是广义上的即:哨兵是进入链表的接口,是要算入链表下标的。不带哨兵的话也就不用额外的申请空间。
2.思路:
那我们从头来分析这个题目:题目让我们建立链表,然后进行一系列的操作。这里以单链表为主。
1.建立一个链表。(这里不详细赘述)
2.链表的初始化(注意:带哨兵和不带哨兵的初始化不一样)
3.获取下标为index:链表的话需要循环链表来获得,然后值得注意的是循环条件到底是大于等于零还是大于零。这个根据你写的循环来定,当然for循环和while循环是有区别的,但是我觉得都可以的,看个人习惯。但是在这里还是要说一下两者的区别:for循环是当知道循环的次数还有循环条件时用,while循环是不知道循环的次数只知道条件的。
4.将一个节点插入到链表的头节点:为方便操作我们以有哨兵为例,首先为新节点申请空间,然后赋值。然后让新节点的下一个指针指向稍兵的下一个节点,然后哨兵下一个节点指向新节点。为啥不先让哨兵节点指向新节点呢?因为这样做之后就找不到下一个节点了。
5.将一个节点插入到链表的最后面:同样的,我们仍需要遍历链表,这就需要用到循环,同样的值得注意的是循环的条件。然后,接下来就是指针的处理,这个是可以有所变通的。
6.将一个节点插入到链表中如果下标等于链表的长度那么就插入到链表的最后如果大于则不会被插入:首先不用想一定是要进行判断(index与链表长度的判断)然后接下来就和上面得没啥区别。
7.删除节点:这个就需要两个下标来循环一个要循环到删除节点,另一个循环到要删除的节点上一个节点,然后让上一个节点的指针指向要删除的节点的下一个节点就好。然后再释放掉你删除的那个节点的空间
8.最后再用一个循环释放你给你的链表申请的空间。