我正面临参考操作的问题: 首先这是一个代码,它取值x并遍历List,删除任何值小于或等于X的链接,但它给我一个不规则的输出.Help是赞赏的。
public void rlx (int x){
Link p = head;//Initializing a pointer equal to head
for (Link c = head.next; c!=null;c=c.next) {//Initializing another Pointer with the Condition to termination
if((int)head.data<=x){//If the Value of head< = to X
head=head.next;//Skip the first and assign head to the second
}else if((int)c.data<=x){
p.next=c.next;//P.next skip c by pointing to c.next instead of c;
}
p=c; reinitialize p;
}
}
主要方法:
public static void main(String [] args){
LinkList l = new LinkList();
l.insertLast(1);
l.insertLast(2);
l.insertLast(3);
l.insertLast(4);
l.insertLast(3);
l.insertLast(2);
l.insertLast(1);
l.rlx(3);
System.out.print(l);
}
OutPut:[4,2]
答案 0 :(得分:0)
你的算法有很多问题,我真的不知道从哪里开始。首先,你不应该在每次循环迭代时检查头部,你应该只检查c.data&lt; = x。其次,只需将前一个指针指向其后的节点,就不会从单个链表中删除节点。你应该只设置p = c如果c.data&gt; x不是每次迭代。我一般都有反对做人的作业的规则,但是这里
public void rlx (int x){
While(head != null && (int)head.data <= x) {
head = head.next
}
Link p = head;//Initializing a pointer equal to head
for (Link c = head.next; c!=null;c=c.next) {//Initializing another Pointer with the Condition to termination
if((int)c.data<=x){
p.next=c.next;//P.next skip c by pointing to c.next instead of c;
}
Else {
p=c;
}
}
}
我没有费心去测试,因为它基本上是伪代码,我假设你的Link类型是一个指针对象。基本上,您需要显式地进行垃圾收集,但更重要的是,您应该删除头部,直到在while循环中找到大于x的值,然后使用单独的for循环来移除head之后的值。否则,如果头部小于x且c小于x,则将移除头部,然后头部将变为c,但由于p仍然是旧头部,因此您将更新列表,以便旧头部指向下一个值是没有意义的,因为没有任何东西指向p而你的当前头部将是c,它也不大于x。然后,p将变为c,其不大于x。 p应该只指向最近发现大于x的链接,并且只有在找到值大于x的链接后才能替换。