我在撰写一段代码时遇到了一些问题,并希望有人能够帮我看看我出错的地方并解释为什么我能更好地理解它
我被告知我的双向链表不再双向联系,但我没有看到我出错的地方。我将在下面列出有问题的代码部分:
public void deleteWithValue(int searchValue)
{
// Delete the first node in the list with the given value.
if (head.data == searchValue)
{
head = head.next;
return;
}
DoublyLinkedListNode current = head;
DoublyLinkedListNode prev = current;
while (current.next != null)
{
prev = current;
current = current.next;
if (current.data == searchValue)
{
prev = current.next;
current = current.next;
current.prev = prev;
break;
}
}
}
非常感谢,
尔杰斯
答案 0 :(得分:0)
如果条件DataBindings
的评估结果为current.data == searchValue
,那么您需要更新下一个节点的true
链接以及前一个节点的prev
链接为了保持双向链接。
目前,您还没有更新next
的链接,因此您正在失去该方向的链接。
此外,您将current.prev.next
节点视为特殊情况的方式意味着如果head
恰好是节点,则current.next.prev
不会更新去除。
请考虑一下:
head
答案 1 :(得分:0)
有两个问题:
John3130开始输入这个问题:
if (head.data == searchValue)
{
head = head.next;
return;
}
在上述情况下,您忘记将head.prev设置为null。
if (head.data == searchValue)
{
head = head.next;
if (head != null) {
head.prev null;
}
return;
}
另一个问题是,当head
为空时,是否调用了delete方法。 (假设head==null
暗示一个空列表。)在尝试使用head.data时会抛出异常。
您实际上根本不需要“prev”值。从头开始搜索后,只需明智地检查null:
public void deleteWithValue(int searchValue) {
DoublyLinkedListNode current = head;
// search
while ((current != null) && (current.data != searchValue)) {
current = current.next;
}
if (current != null) {
if (current.next != null) {
current.next.prev = current.prev;
}
if (current.prev != null) {
current.prev.next = current.next;
}
if (current == head) {
head = current.next;
}
}
}