我有一个工作方法,用于删除给定密钥的链表中的节点。那时我的Node类嵌套在LinkedList类中,我可以直接访问节点类的成员(例如head.next和head.data)。我重构了代码以拥有一个单独的Node类,并为数据和下一个成员设置了accessor和mutator方法。 (我正在准备面试,所以我正在处理许多链接列表问题,所以我认为有一个单独的类使得我不需要复制和粘贴大量代码。
这是我的Node.java:
package linkedlistproblems;
public class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
我从LinkedList.java中删除节点的方法:
// delete node with key = data
public void deleteNode(int data) {
System.out.println("Deleting node with key = " + data);
if (head == null) {
System.out.println("Linked list does not contain key = " + data);
return;
}
else if (head.getData() == data) {
Node temp = head;
head = head.getNext();
nElements--;
temp = null;
}
else {
Node n1 = head;
Node n2 = head.getNext();
while(n2 != null) {
if (n2.getData() == data) {
n1.getNext().setNext(n2.getNext());
nElements--;
break;
}
n1 = n1.getNext();
Node temp = n2;
n2 = n2.getNext();
temp = null;
}
if (n2 == null)
System.out.println("Linked list does not contain key = " + data);
}
}
此方法不起作用。在检查数据后,它会进入 if ,但不会删除节点。
以下是有效的旧方法:
// delete node with key = data
public void deleteNode(int data) {
System.out.println("Deleting node with key = " + data);
if (head == null) {
System.out.println("Linked list does not contain key = " + data);
return;
}
else if (head.data == data) {
Node temp = head;
head = head.next;
nElements--;
temp = null;
}
else {
Node n1 = head;
Node n2 = head.next;
while (n2 != null) {
if (n2.data == data) {
n1.next = n2.next;
nElements--;
break;
}
n1 = n1.next;
Node temp = n2;
n2 = n2.next;
temp = null;
}
if (n2 == null)
System.out.println("Linked list does not contain key = " + data);
}
}
这是测试代码的主要方法:
public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.add(70);
ll.add(10);
ll.add(55);
ll.add(22);
System.out.println("Original List: " + ll);
ll.deleteNode(70);
System.out.println(ll);
ll.deleteNode(22);
}
我已经重写了toString方法来漂亮地打印链表(这里没有显示)。我不确定为什么使用accesssor mutators的重构方法不起作用。
输出:
Original List: 70 ---> 10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 70
10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 22
10 ---> 55 ---> 22 ---> NULL
10 ---> 55 ---> 22 ---> NULL
此外,每当我删除一个节点时,我将其分配给temp,将其从列表中删除并将temp指定为null。我这样做是为了防止游荡。我这样做了吗?
感谢您的帮助!
答案 0 :(得分:1)
原始行的逻辑
n1.next = n2.next;
与新实施不匹配
n1.getNext().setNext(n2.getNext());
这相当于
n1.next.next = n2.next;
来自原始实现