簡體   English   中英

從鏈接列表中刪除學生

[英]Removing student from linked list

我正在開發一個簡單的程序,以重新整理我的鏈表。 我的刪除學生方法遇到問題。 應該做的就是檢查兩個學生是否具有相同的學生ID,如果有,請刪除該學生,因為學生是唯一的。

我有一個主要問題,那就是如果學生在名單的最后,這給我帶來了各種各樣的問題。 總的來說,這似乎也在消除錯誤的學生。

方法如下

public boolean remove(StudentIF s) {
    // TODO Auto-generated method stub
    StudentLLNode current = head;
    if(s == null){
        return false;
    }
    if(s.getId() == (head.getStd().getId())){
        //StudentLLNode  top = head;
        head = head.getNext();
        size--;
        return true;
    }
    else{
        while(current != null){
            if(s.getId() == (current.getStd().getId())){
                current.setNext(current.getNext().getNext());
                size--;
                return true;
            }
            current = current.getNext();
        }
    }
    return false;
}

這是我界面中的存根

// remove StudentIF s *** using its equals method ***
    public boolean remove(StudentIF s);

通過做:

current.setNext(current.getNext().getNext());

似乎您要刪除下一個元素而不是當前元素。

當您到達列表的末尾時,getNext()返回null。 在null之后沒有下一個元素,這就是為什么到達列表末尾會出現異常的原因。

其他容器更適合避免重復元素。 例如,集合或地圖。

這是完整的解決方案:

package linkedList;

import java.util.Iterator;

public class StudentList {

    private int size = 0;

    private StudentIF head;

    public StudentList(StudentIF studentTobeAdded) {
        head = studentTobeAdded;
        size++;

    }

    public void addStudent(StudentIF studentTobeAdded) {
        StudentIF curent = head;
        while (curent.getNext() != null) {
            curent = curent.getNext();
        }
        size++;
        curent.setNext(studentTobeAdded);
    }

    public boolean removeStudent(StudentIF studentToBeRemoved)

    {

        int id = studentToBeRemoved.getId();

        StudentIF current = head;
        if (head.getId() == id) {
            head = head.getNext();
            size--;
            return true;
        }
        while (current.getNext() != null) {
            StudentIF next = current.getNext();

            if (next.getId() == id) {
                current.setNext(next.getNext());
                size--;
                return true;
            }
            current = next;
        }
        return false;
    }

    public int getSize() {
        return size;
    }

    public StudentIF getHead() {
        return head;
    }

    public void addListOfStudents(StudentIF... list) {
        for (StudentIF studentIF : list) {
            this.addStudent(studentIF);

        }
    }

    @Override
    public String toString() {
        StudentIF current = head;
        StringBuilder sb = new StringBuilder();
        while (current != null) {
            sb.append(current.getId() + " ");
            current = current.getNext();

        }
        return sb.toString();
    }
}

學生:

package linkedList;

public class StudentIF {
    private int id;
    private StudentIF next;

    public StudentIF(int id) {
        this.id = id;
        next=null;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public StudentIF getNext() {
        return next;
    }

    public void setNext(StudentIF next) {
        this.next = next;
    }



}

在while循環中,您不處理要刪除的學生位於鏈接列表末尾的情況,因此current.getNext().getNext()是NPE。

另外,您的代碼沒有刪除ID相等的學生,實際上是在所述學生之后刪除了該學生。

以下內容可以解決您的問題(盡管尚未進行編譯或測試)。

...
else {
// head == current and if we get here, the if branch has not fired
StudentLLNode previous, next;
previous = current;
current = current.getNext();
while(current != null){
   next = current.getNext();
   if(s.getId() == (current.getStd().getId())){  
        previous.setNext(next); //doesn't matter if next is null or not
        size--;
        return true;
   } 
   previous = current;
   current = next;
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM