[英]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.