日期:2014-05-20  浏览次数:20941 次

关于模拟LinkedList中的remove方法
老师让我们模拟下LinkedList中的remove方法小弟想了半天才想出来这么个办法,可是这个办法只能删除头结点和尾结点,中间的没反映。
小弟的思路是将删除元素分成三种情况:1.删除的是头结点 那么就将head=第二个结点,然后将原来的头结点的引用变为null
  2.删除尾结点 那么就将最后个元素的引用变为null 3.删除中间部分的,先用一个Node变量 nn记录住我传入的索引的元素中的引用 Node nn=temp; 然后将temp=nn.next; 最后将nn的引用变为null
具体代码如下
Java code

class Node {
    
    Object data;  //数据元素
     Node next;  //指向下一个节点
    
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
}

class LinkList {
    
     Node head;  //头节点
    private int len;
    public LinkList(){
        len=0;
    }
    
    public LinkList(Node node){
        this.head=node;
        len=0;
    }
    
    
    public void add(Node node){
        if(head==null){
            head=node;
            len++;
        }
        else{
            Node temp=head;
            while(temp.next!=null){
                temp=temp.next;
            }
            temp.next=node;
            len++;
        }
    }
    public void remove(int index){
        System.out.println(len);
        if(index>=len||index<0){
            throw new ArrayIndexOutOfBoundsException();
        }
        
    
            Node temp=head;
            while(temp.next!=null){
            
                temp=temp.next;
            
                if(index==0){//0表示第一个元素.
                    System.out.println("删除第一个");
                    Node n=head;
                    head=n.next;
                    n=null;
                    break;
                }else if(index==len-1){
                    System.out.println("删除最后");
                    temp.next=null;
                    break;
                }else{
                    System.out.println("删除中间");
                    Node nn=temp;
                    temp=nn.next;
                    nn=null;
                    break;
                }
            }
        }
public void display(){
        Node temp=head;
        while(temp!=null){
            System.out.println(temp);
            temp=temp.next;
        }
    }
}


class Test {
    public static void main(String[] args) {
        LinkList link=new LinkList();
    
        Node n1=new Node();
        link.add(n1);
        Node n2=new Node();
        link.add(n2);
        Node n3=new Node();
        link.add(n3);
        
        link.remove(1);//删除第二个元素,0表示第一个.
        

        System.out.println(n1);
        System.out.println(n2);
        System.out.println(n3);
        System.out.println("------------------------------------");
        
        link.display();

    }

}



------解决方案--------------------

------解决方案--------------------
大概看了一下,删除的时候,你else{相当于不满足首尾删除两种就执行,然后就break了,根本就不是删除你的index目标节点,所以改成

Java code
Node temp=head;
int current = 0;
while(temp.next!=null){
   ...//代码不变

   else if (current==index){ //循环到目标节点才执行
        ...//代码不变
    }

    current++; //节点位置+1
}