java - 在链表Java中插入一个位置
问题描述
我的问题是:编写一个函数,将一个新项目插入到给定位置的整数链接列表中。我的代码是:
public static SinglyLinkedListNode insert_at_position(SinglyLinkedListNode head, int val, int pos) {
SinglyLinkedListNode temp = head;
if (pos == 0)
{
SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
newNode = temp;
head = newNode;
}
else if (pos > 0)
{
SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
newNode = temp;
head = newNode;
for (int i = 0 ; i <= pos; i++)
{
temp = head.next;
if (i == pos)
{
head.next = newNode;
newNode = temp;
}
}
}
return head;
}
我的代码只打印了很多 1。它有什么问题?
解决方案
一些问题:
代码创建一个新节点,将其分配给
newNode
,然后立即分配temp
给newNode
,从而失去对新创建节点的引用temp
用 的值初始化head
,然后newNode
获取 的值,temp
然后head
获取 的值temp
。这意味着您已设置head
为 ...head
,即无操作。循环
temp = head.next;
在每次迭代中执行。这将始终在每次执行时将相同的引用放在... 中。temp
因此循环的迭代次数变得无关紧要。temp
将始终引用列表中的第二个节点。这样做会更有意义temp = temp.next
在您设置的最后一次迭代中
head.next = newNode;
...甚至忽略您对temp
. 此分配不使用循环迭代期间完成的任何操作。它也可以在循环之外执行。最后一条语句
newNode = temp
没有做任何有用的事情。newNode
在该语句之后从未使用过,因此它可能不存在。如果是的话,它会更有意义newNode.next = temp
。这将有效地链接newNode
到潜在的下一个节点。循环迭代太多次。正如您习惯
pos == 0
在列表的开头插入新节点一样,pos == 1
应该在节点之后插入新节点head
,不需要迭代。仅当pos > 2
您需要迭代时。
这是一个更正的版本:
public static SinglyLinkedListNode insert_at_position(SinglyLinkedListNode head,
int val, int pos) {
SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
if (pos == 0) {
newNode.next = head;
head = newNode;
} else if (pos > 0) {
SinglyLinkedListNode temp = head;
for (int i = 1; i < pos; i++) {
temp = temp.next;
}
newNode.next = temp.next;
temp.next = newNode;
}
return head;
}
推荐阅读
- android - 尝试添加错误的卡时,Stripe 崩溃
- python - Pandas:根据相邻行值的条件选择行
- javascript - _.findIndex() 总是返回 -1 (lodash.js)
- sockets - 单台机器可能的最大 Socket(用于 HTTP 流量)连接数
- .htaccess - .htacess 中的所有规则集中在一处
- sql - Postgres JSONB 查询简化
- uri - 如何通过深层链接 URI 在 Microsoft Teams 中打开新对话?
- java - 如何比较两个排序的 OrderedMap 以查找每个地图中的最高值?
- html - HTML 隐藏基于价值
- pandas - Pandas 对列值进行排序,而不相应地对日期时间进行排序