白银挑战——链表反转的拓展问题

首先附上leetcode

92. 反转链表 II - 力扣(LeetCode)

虚拟头节点涉及换头的问题:

假设我们有一个单链表,用于存储学生的信息,包括姓名和成绩。当我们需要对这个链表进行插入、删除或者其他操作时,通常需要考虑链表为空的情况和非空的情况。

在没有虚拟头节点的情况下,如果链表为空,我们需要对头节点进行特殊处理。例如,当我们需要在空链表中插入一个新的节点时,我们需要单独处理头节点为空的情况,即创建一个新的节点并将其设为头节点。这样会使得代码逻辑变得复杂,需要额外的处理步骤。

而当我们引入虚拟头节点时,可以避免对头节点的特殊处理。虚拟头节点作为链表的起始节点,它的next指针指向实际的头节点。无论链表是否为空,我们都可以将对链表的操作看作对普通节点的操作。例如,在空链表中插入一个新的节点时,我们只需要将新节点插入虚拟头节点后面即可,无需单独处理头节点为空的情况。

举个例子,假设我们有一个空链表,需要插入一个新的节点 “Alice”,成绩为 90。如果没有虚拟头节点,我们需要特殊处理链表为空的情况。而如果引入了虚拟头节点,我们只需要将新节点插入虚拟头节点的后面,即可完成插入操作。

具体操作如下:

  1. 初始时,链表为空,只有一个虚拟头节点。
  2. 需要插入一个新节点 “Alice”,成绩为 90。
  3. 将新节点的next指针指向虚拟头节点的next指针指向的节点。
  4. 将虚拟头节点的next指针指向新节点。
  5. 完成插入操作,链表中有一个节点,即新节点 “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呢?这个没考虑到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值