我使用C ++学习了大多数链接数据结构,其中可以通过引用进行传递,并且递归非常简单。我最近改用Java,并且总是对这些结构的递归版本感到困惑。
我想从列表中删除该节点。但是我想返回该节点。当我从else if
分支返回已删除的节点时,它可能会使列表混乱。但是我看不到解决方法。
public node deleteval (int val){
node prev = head;
head = deleteval(head,prev,val);
return head;
}
private node deleteval(node head,node prev, int val){
if(head == null){
return null;
}
else if (head.value == val){
prev.next = head.next;
node deleted = head;
head = prev;
return head.next;
}
prev = head;
head.next = deleteval(head.next,prev,val);
return head;
}
这不是一项作业,只是试图理解。感谢您的输入。
答案 0 :(得分:1)
要删除节点,您只需要做prev.next = head.next
并处理root
节点的边缘情况。不需要堆栈或任何其他支持的数据结构,您只需将其递归到列表深处,直到找到该值或到达末尾为止。
private Node root;
public Node deleteVal(int val) {
return deleteRec(root, null, val);
}
private Node deleteRec(Node head, Node prev, int val) {
if (head == null) {
return null;
}
if (head.value == val) {
if (prev != null) {
prev.next = head.next; // deleting non-root node
} else {
root = null; // deleting root node
}
return head;
}
return deleteRec(head.next, head, val);
}