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是否在列表中,-ifnot->return false;

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

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

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

//实际上我发现我的问题是我们是否可以在函数内部更改传递给函数的引用,例如:

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

//所以b会改变吗?

4

3 回答 3

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

  } 
}
于 2012-11-02T05:25:39.157 回答
0

Java 通过引用传递的想法意味着,当您调用一个方法并给某个对象作为参数时,您将获得一个指向同一对象的新引用。

更改值将更改对象,进而影响其他引用。但是如果你给参数一个新的值,只有那个会被改变,指向一些不同的对象。(值得一提的是,有些语言确实允许更改参数,以更改第一个传递的参数。)

于 2012-11-02T06:26:01.633 回答
-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);
    }
}
于 2012-11-02T05:17:34.313 回答