list - 双向链表交换解释
问题描述
'编写一个程序来交换双向链表的前两个节点。
有人可以用图像解释这件事吗?
void swapFirstTwo() {
if (head != tail) {
DLLNode neck = head.next;
head.next = neck.next;
neck.next = head;
head.prev = neck;
neck.prev = null;
if (tail == neck) // two element list
tail = head;
head = neck;
}
}
解决方案
示例-1
1<=>2<=>3->空
结构体-
1.next = 2;2.next = 3;3.next = null; 1.prev = null;2.prev = 1;3.prev = 2;
交换前两个元素意味着交换它们的位置。因此,一旦交换完成,列表将如下所示 - 2<=>1<=>3->null
这就是您粘贴的代码给出预期结果的方式 -
脖子=头。下一个;颈部 = 2;
脖子。下一个=头;2.下一个 = 1;
head.prev = 脖子;1.prev = 2;
head.next = 颈部.next; 1.下一个= 3;
颈部.prev = null; 2.prev = null;
基本上,交换 1 和 2 的 next 和 prev 指针。将上述所有步骤加起来,您会得到-
2.next = 1;1.next = 3;3.next = null 2.prev=null;1.prev = 2;3.prev = 2;
但是上述逻辑中缺少的一步是头部应该指向颈部。因为,交换元素时头部会发生变化。
示例 2
如果列表中只有一个元素,则无需交换
示例 3
如果只有两个元素,除了更改头的指针外,由于维护了列表的尾(尾),您将更新尾,并且尾在交换后将指向当前头,而不是它应该指向当前的脖子。
推荐阅读
- r - stringdist_semi_join 仅显示来自 dataframe1 的列
- android - 无法为 [type:Factory,primary_type:'yodgorbek.komilov.musobaqayangiliklari.viewmodel.MainViewModel' 创建实例?
- java - 没有文件 IO 的 AWS 凭证
- java - 如何在 JPA 中持久化与其他实体具有多对多关联的实体?
- javascript - 如何改变 Map 对象 ES6 中给定键的值
- r - 使用 extrafont 或 showtext 库向 R 添加字体(在 Mac 上通过 FontBook)
- python - 从 Python 中的语言环境中去除变体?
- android-studio - cmd:找不到服务:活动#Error:ADB在flutter中以退出代码1退出
- python - BeautifulSoup Python 没有捕获文件中的所有 HTML
- python - 用于仅 FTP 虚拟主机的 Python