对链表删除感到困惑

时间:2012-11-02 05:12:38

标签: java

我正在尝试在

中实现删除功能
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是否在列表中, -if not->return false;

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

-else遍历它前面的list元素。

问题是要删除的元素是第一个元素,例如boolean 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);}

//所以会改变吗?

3 个答案:

答案 0 :(得分:1)

对第一个列表元素的引用要么由列表对象本身持有,要么由“不可见”根元素持有(如果是单个链接列表)。

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

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

  } 
}

答案 1 :(得分:0)

Java Pass by Reference的观点意味着,当您调用方法并将某个对象作为参数时,您将获得指向同一对象的 new 引用。

更改值,将更改对象,反过来也会影响其他引用。但是,如果为参数赋予新值,则只会更改该值,以指向某个不同的对象。 (值得一提的是,有些语言允许更改参数,更改第一个传递的参数。)

答案 2 :(得分:-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);
    }
}