2012-11-02 46 views
1

我想实现删除功能困惑链表删除

public static boolean delete(Object d, ListElement head){ 
ListElement p=find(d,head); 
if(p.data==null){return false;} 
else { 
    System.out.println("Delete Successfully!"); 
    if(head.data==d){head=head.next;} 
    else{ 
    while(head.next.data!=d){ 
     head=head.next; 
    } 
    head.next=head.next.next;} 
    return true;} 

} 

这个功能基本上检查元素d是在列表中, - 如果not->return false;

-else检查是否元素是列表中的第一个元素,如果true,将头部更改为它的next,

-else遍历到它前面的列表元素。

问题是,要删除的元素是第一个元素,例如布尔型s=ListElement.delete(1,d);我不能使用“head=head.next;”将新值赋给head。 但是java通过引用传递,为什么我不能改变它?

//其实我发现我的问题是,我们是否可以改变传递给函数的功能 内引用,如:

void fun(dog a){ 
    a=new dog("Po"); 
} 
main() 
{dog b=new dog("Jo");fun(b);} 

//所以将b是否会改变?

回答

1

到第一列表元素的参考或者由列表对象本身或由“不可见”的根元素保持(在单链表的情况下)。

所以你要么必须将整个列表传递给方法,要么如果你有那个不可见的根,传递根作为头。

public static boolean delete(Object d, MyLinkedList<ListElement> list) { 

    ListElement head = list.getHead(); 
    if (head.data.equals(d)) { // <- ALWAYS use equals, never == to compare objects!! 
    list.setHead(head.next); 
    } else { 
    ListElement element = head.next; 

    // ... the rest is similiar to your algorithm 

    } 
} 
+0

这是一个解决方案。嗯,我试图避免使用集合来实现我自己的类。基本上,我的问题是我们是否可以改变传递给函数内部函数的参考值。 –

+0

我们不能改变“通过参考”,这是根本。而且,我的解决方案不需要使用Collections类。我会改变类型名称,使其更清晰:) –

+0

Thx!所以我需要在MyLinedList类中添加setHead()函数来重置头部。只是想知道是否会有更加漂亮的方式将两种情况(第一种元素)结合在一起。真的很感谢你的回复 –

-1
void delete(visit_ptr_node_type this_is_the_node) 
{ 
    visit_ptr_node_type one_back; 
    if(anchor == NULL) 
    printf("\n The list is empty"); 
    else 
    { 
    if(this_is_the_node==anchor) 
     anchor=anchor->next_ptr; 
    else 
     { 
     one_back=anchor; 
     while(one_back->next_ptr != this_is_the_node) 
    one_back=one_back->next_ptr; 
     one_back->next_ptr = (this_is_the_node) ->next_ptr; 
     } 
    free(this_is_the_node); 
    } 
} 
+1

这是(1)不是java和(2)使用一些全局变量(锚点),所以答案不是真正帮助解决底层的“在Java中通过引用”的问题。 –

0

Java的引用传递的想法意味着,当你调用一个方法,并给予一定的对象作为参数,你会得到一个新的参考指向同一个对象。

改变值,会改变对象,反过来也会影响其他的引用。但是如果你给参数赋予一个新的值,那只会改变它,指向一些不同的对象。 (值得一提的是,有些语言允许改变参数,改变第一个参数。)