首先附上leetcode
虚拟头节点涉及换头的问题:
假设我们有一个单链表,用于存储学生的信息,包括姓名和成绩。当我们需要对这个链表进行插入、删除或者其他操作时,通常需要考虑链表为空的情况和非空的情况。
在没有虚拟头节点的情况下,如果链表为空,我们需要对头节点进行特殊处理。例如,当我们需要在空链表中插入一个新的节点时,我们需要单独处理头节点为空的情况,即创建一个新的节点并将其设为头节点。这样会使得代码逻辑变得复杂,需要额外的处理步骤。
而当我们引入虚拟头节点时,可以避免对头节点的特殊处理。虚拟头节点作为链表的起始节点,它的next指针指向实际的头节点。无论链表是否为空,我们都可以将对链表的操作看作对普通节点的操作。例如,在空链表中插入一个新的节点时,我们只需要将新节点插入虚拟头节点后面即可,无需单独处理头节点为空的情况。
举个例子,假设我们有一个空链表,需要插入一个新的节点 “Alice”,成绩为 90。如果没有虚拟头节点,我们需要特殊处理链表为空的情况。而如果引入了虚拟头节点,我们只需要将新节点插入虚拟头节点的后面,即可完成插入操作。
具体操作如下:
- 初始时,链表为空,只有一个虚拟头节点。
- 需要插入一个新节点 “Alice”,成绩为 90。
- 将新节点的next指针指向虚拟头节点的next指针指向的节点。
- 将虚拟头节点的next指针指向新节点。
- 完成插入操作,链表中有一个节点,即新节点 “Alice”。
通过引入虚拟头节点,我们简化了对链表的插入操作,无需对空链表进行特殊处理,使得代码逻辑更加清晰和简洁。
指定区间反转
一共有两种方法,第1种呢是找到头尾,然后将它切断,将需要反转的部分反转之后再缝起来。
另外一种则是通过更改的方式直接穿针引线。
两两交换链表中的节点
24. 两两交换链表中的节点 - 力扣(LeetCode)
(重做时候请重新画图理解比较好)
第一种递归的方法比较巧妙 最重要的就是通过ListNode*newhead=head->next;
然后通过递归的调用函数同时传入(newhead->next)巧妙迭代成两个两个一换
第二种通过迭代的方法 其实本质上就是通过运用删除加上插入进行迭代
leetcode369
【LeetCode】369. 给单链表加一 Plus One Linked List_负雪明烛的博客-CSDN博客
【LeetCode - 369】给单链表加一_j给单链表加一_学哥斌的博客-CSDN博客
上述两种都值得琢磨 反转你应该没有问题 然后进位需要考虑的 怎么理解它的思路?
需要注意的就是进位问题 如果有9 就需要变成0 前一位进一
有可能有一个9 就有可能有多个9 类推下来 就需要标记最前面一个不是9的 让它去进1 其他的就全部变成0(这样就会包括到只有一个9的情况)这个没考虑到
然后如果第一个是9 也就是newhead是9呢?这个没考虑到