老师让我们模拟下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}