[英]double linked list method in java
java中双链表的这种方法运行一次while循环然后卡住并且不继续
public static DoubleLinkedList reverse(DoubleLinkedList DL) {
DoubleLinkedList result = new DoubleLinkedList();
Node tempDL = DL.head;
if(DL.head==null || DL.head.next==null){
result.head=DL.head;
result.tail = DL.head;
}else{
while(tempDL != null){
result.insertNode(tempDL.data, 0);
tempDL = tempDL.next;
}
}
return result;
}
这是插入节点的方法供参考:
public void insertNode(int data, int pos) {
Node newNode = new Node(data);
if (head == null)
head = tail = newNode;
if (pos > length())
return;
if (pos == 0) { // comment #1
newNode.next = head;
head.prev = newNode;
head = newNode;
} else {
Node temp = head;
for (int i = 0; i < pos - 1 && temp.next != null; i++)
temp = temp.next;
if (temp.next == null) {
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
} else {
newNode.prev = temp;
newNode.next = temp.next;
temp.next.prev = newNode;
temp.next = newNode;
}
}
}
正如您在评论 #1 中看到的,这是我在反向方法中调用该方法时起作用的部分
我尝试使新列表 go 的尾部向后,而主列表 go 的头部向前,但随后它自己镜像如下:
主列表:1、2、3、4、5
打电话后:
1, 2, 3, 2, 1
您的insertNode
方法创建了一个循环。 当您使用调试器运行代码时,这是非常明显的,单步执行代码......
当列表为空且 pos 为 0 时,执行以下操作:
if (head == null)
head = tail = newNode;
到目前为止一切顺利,但这里继续执行:
if (pos == 0) {
newNode.next = head;
head.prev = newNode;
head = newNode;
}
这不好:一个循环被创建为 now head.next == head
。 第一个if
应该包括一个return
:
if (head == null) {
head = tail = newNode;
return;
}
将长度检查放在 function 的顶部也会更有意义,因此它始终会被执行。 如果为真,则没有理由创建节点实例:
if (pos > length())
return;
这不是你的问题,但还有另一点要说明: reverse
方法不应从原始列表中创建新列表引用节点,就像第一个if
块中发生的那样。 当两个列表之一获得新节点时,这将导致意外行为:然后根据该新节点的 position,另一个列表将具有或不具有它。
所以我建议您删除这种情况,并始终像在一般情况下一样为新列表创建节点:
public static DoubleLinkedList reverse(DoubleLinkedList DL) {
DoubleLinkedList result = new DoubleLinkedList();
Node tempDL = DL.head;
while(tempDL != null){
result.insertNode(tempDL.data, 0);
tempDL = tempDL.next;
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.