这是一个相当简单的问题,但我很困惑:从约束链表中删除元素
给定一个单向链表,编写一个函数来删除一个给定的节点。
1)它必须接受指向开始节点的指针作为第一个参数,并删除节点作为第二个参数,即指向头节点的指针不是全局的。 2)它不应该返回指向头节点的指针。 3)它不应该接受指向头节点的指针。
Java中的解决方案如下:
void deleteNode(Node node, Node n) {
if (node == n) {
if (node.next == null) {
System.out.println("There is only one node. The list "
+ "can't be made empty ");
return;
}
node.data = node.next.data;
n = node.next;
node.next = node.next.next;
System.gc();
return;
}
// When not first node, follow the normal deletion process
// find the previous node
Node prev = node;
while (prev.next != null && prev.next != n) {
prev = prev.next;
}
if (prev.next == null) {
System.out.println("Given node is not present in Linked List");
return;
}
prev.next = prev.next.next;
System.gc();
return;
}
我很困惑,为什么在删除头节点,我们不修改头指针,但复制的区域,而不是(更改内容)但是在删除其他节点时,只是简单地使用prev.next = prev.next.next
如果我们只是在删除头节点时做head = head.next
,它会起作用吗?
谢谢!
非常感谢!我明白了,因为head不能作为全局指针传递,所以改变局部变量不会做任何事情。我认为代码的另一个问题是系统。GC()。我觉得这不是非常必要,C语言中的逻辑比Java中的更好。你能指出什么是删除节点的典型方法吗? – AngieCris
此外,我很困惑为什么删除头部我们需要将所有内容从头到尾移动,但是当删除中间节点时,'prev.next = prev.next.next'就会起作用。 – AngieCris
@AngieCris好的我会在文中回答这两个问题 – sprinter