如何将节点链表中的搜索值移动到链表的头部?
How to move a searched value in a linked list of nodes to the head of the linked list?
我正在尝试编写一个 find(Object x)
方法,如果找到一个存储 Object y.equals(x)
的节点,将该节点移动到链表(自组织列表)的前面。如果找到,方法 returns 被移到前面的节点的值。如果没有找到,return null。
我的节点 inner-class 包含一个 Node<T> next
和一个 Object val
。
这是我尝试过的:
public Object find(Object x) {
//cant find an object that doesnt exist
if (isEmpty()) {
return null;
}
// store the head
Node tmp = head;
//keep track of previous for updating the link if found
Node prev = null;
//traverse linked list
while (tmp!=null) {
//find x
if (tmp.val.equals(x)) {
//update node storing x to be the head
tmp = head;
//re-link the LL
prev.next = tmp.next;
return head.val;
}
//continue traversing if not found
prev = tmp;
tmp = tmp.next;
}
//x was not found, return null;
return null;
} // end find
我的方法没有正确找到对象,但目前我似乎找不到代码有什么问题。是否需要逆序遍历链表才能做到这一点?
if
块没有正确地重新连接您的列表。 tmp = head
不会移动一个节点成为头部。你 失去 tmp
引用的任何内容。您应该 mutate tmp
(而不是分配给它)并指出它的 后继者 将是当前的 head
。然后你应该将其推广为 head
:
if (tmp.val.equals(x)) {
// Only change something when the match is not the current head
if (prev != null) {
// First(!) re-link the LL
prev.next = tmp.next;
// Move the node before the current head
tmp.next = head;
// Finally, make it the head
head = temp;
}
return head.val;
}
我正在尝试编写一个 find(Object x)
方法,如果找到一个存储 Object y.equals(x)
的节点,将该节点移动到链表(自组织列表)的前面。如果找到,方法 returns 被移到前面的节点的值。如果没有找到,return null。
我的节点 inner-class 包含一个 Node<T> next
和一个 Object val
。
这是我尝试过的:
public Object find(Object x) {
//cant find an object that doesnt exist
if (isEmpty()) {
return null;
}
// store the head
Node tmp = head;
//keep track of previous for updating the link if found
Node prev = null;
//traverse linked list
while (tmp!=null) {
//find x
if (tmp.val.equals(x)) {
//update node storing x to be the head
tmp = head;
//re-link the LL
prev.next = tmp.next;
return head.val;
}
//continue traversing if not found
prev = tmp;
tmp = tmp.next;
}
//x was not found, return null;
return null;
} // end find
我的方法没有正确找到对象,但目前我似乎找不到代码有什么问题。是否需要逆序遍历链表才能做到这一点?
if
块没有正确地重新连接您的列表。 tmp = head
不会移动一个节点成为头部。你 失去 tmp
引用的任何内容。您应该 mutate tmp
(而不是分配给它)并指出它的 后继者 将是当前的 head
。然后你应该将其推广为 head
:
if (tmp.val.equals(x)) {
// Only change something when the match is not the current head
if (prev != null) {
// First(!) re-link the LL
prev.next = tmp.next;
// Move the node before the current head
tmp.next = head;
// Finally, make it the head
head = temp;
}
return head.val;
}