|
|
1
14
另一种不访问两次节点的方法如下: 创建一个大小为n的空数组,从索引0开始指向该数组的指针,并从链接列表的开头开始迭代。每次访问节点时,都将其存储在数组的当前索引中,并前进数组指针。当填充数组时,环绕并覆盖以前存储的元素。当到达列表末尾时,指针将指向列表末尾的元素n。 但这也只是一个O(N)算法。你现在做的很好。我认为没有令人信服的理由去改变它。 |
|
|
2
7
开始两个指针。移动第一个
编辑
:是的,它与问题中给出的代码基本相同。但我觉得伪代码更清楚了。要回答这个问题,没有其他的方法能比第一个更有效。
|
|
|
3
6
保持两个指针和节点之间的距离。当第一个指针到达尾部时,第二个指针将指向所需的节点。 代码:
} |
|
|
4
4
我使用的静态变量“i”将递增 而从列表的末尾进行回溯。就像在 问题陈述,我们基本上会跟踪第n个 从链接列表结尾开始的元素。 递归帮助我们从末尾跟踪。
|
|
|
5
1
你的跑步时间还是O(N),所以我看不出有什么问题。 从概念上讲,可以将列表分为两部分:返回节点之前的部分和返回节点之后的部分。其中一个部分必须步行两次。您的实现选择了第一个,其优点是没有额外的内存使用(除了几个临时变量)。 或者,您可以创建一个堆栈,浏览列表并将每个元素放入堆栈,然后弹出n个项。然后你将走到列表的末尾两次,而不是开始。这样做的缺点是将列表存储在内存中两次。(您可以通过只存储n个元素并在添加新元素时将它们从堆栈底部放下来,从而使堆栈更智能;然后您只需要使用足够的空间来存储n个节点。) 我假设你不能把清单倒过来把它吹走。然后是持续的记忆,仍然是O(N),仍然走在列表的末尾两次。 |
|
|
6
1
|
|
|
7
1
使用双指针ptemp和nthnode。最初,这两个节点都指向列表的头节点。nthnode仅在ptemp进行n次移动后才开始移动。从两者向前移动,直到ptemp到达列表末尾。结果,nth node从链接列表的末尾指向nth节点。
参考教材:“Java中的数据结构和算法” |
|
|
8
0
您可以使用双重链接列表,它是一个也存储其父级地址的链接列表。横向比较容易,因为你可以从结尾开始,一直到开头。 |
|
9
0
首先计算列表中的节点数。然后再次遍历,计数n个更少的节点。仍然是一个O(N)算法,这是不可避免的。 |
|
|
10
0
很简单…… 取两个指针p1,p2 在p1移动“n”节点后启动p2,让p1移动到最后一个节点。p2指向的节点将是从最后一个节点开始的第n个节点。 |
|
|
11
0
这个代码似乎更清楚。
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |