這個(gè)錯(cuò)誤如題很奇怪,dubug下提示類(lèi)中的Node類(lèi)空指針,而直接運(yùn)行就不會(huì)報(bào)錯(cuò)誤,圖如下正常執(zhí)行dubug運(yùn)行內(nèi)部實(shí)現(xiàn)代碼如下package?utils;
/**
?*?@author?yqs
?*?@description
?*?@time?2019/7/13?18:09
?*/
public?class?SingleLinked<E>?{
????private?int?size;
????private?Node<E>?dummyHead;
????public?SingleLinked(){
????????dummyHead?=?new?Node<>();
????}
????private?class?Node<E>{
????????private?Node?next;
????????private?E?element;
????????public?Node(){
????????????this(null,?null);
????????}
????????public?Node(E?element,Node?next){
????????????this.element?=?element;
????????????this.next?=?next;
????????}
????????@Override
????????public?String?toString(){
????????????if?(element!=null){
????????????????return?element.toString();
????????????}
????????????return?null;
????????}
????}
????public?void?addFirst(E?e)?{
????????dummyHead.next?=?new?Node<>(e,dummyHead.next);
????????size++;
????}
????//指定位置添加元素
????public?void?add(E?e,?int?index)?{
????????if?(index?<?0?||?index?>?size)?{
????????????throw?new?IllegalArgumentException("index?is?illegal,add?failed");
????????}
????????Node?head?=?dummyHead;
????????for?(int?i?=?0;?i?<?index;?i++)?{
????????????head?=?head.next;
????????}
????????head.next?=?new?Node(e,head.next);
????????size++;
????}
????public?void?addLast(E?e){
????????add(e,size);
????}
????//在指定位置刪除元素
????public?E?remove(int?index){
????????//System.out.println(dummyHead);
????????//存虛擬頭結(jié)點(diǎn)
????????Node<E>?prev?=?dummyHead;
????????for?(int?i?=?0;?i?<?index;?i++)?{
????????????prev?=?prev.next;
????????}
????????//將當(dāng)前元素存入prev_temp臨時(shí)變量中
????????Node<E>?prev_temp?=?prev.next;
????????//將當(dāng)前元素的前一個(gè)節(jié)點(diǎn)的next指向當(dāng)前元素的下一個(gè)節(jié)點(diǎn);
????????prev.next?=?prev_temp.next;
????????//將當(dāng)前元素的next設(shè)置為null等待虛擬機(jī)回收
????????prev_temp.next?=?null;
????????size--;
????????return?prev_temp.element;
????}
????public?int?getSize()?{
????????return?size;
????}
????public?boolean?isEmpty(){
????????return?size?==?0;
????}
????@Override
????public?String?toString(){
????????StringBuilder?sb?=?new?StringBuilder();
????????for?(int?i?=?0;?i?<?size;?i++)?{
????????????sb.append(dummyHead.next);
????????????sb.append(",");
????????????dummyHead?=?dummyHead.next;
????????}
????????return?sb.toString();
????}
}另外,要是換成雙向鏈表要加一個(gè)尾節(jié)點(diǎn),還有要不要在Node類(lèi)中加一個(gè)prev節(jié)點(diǎn)指向上一個(gè)呢,我看網(wǎng)上有的教程并沒(méi)有加這個(gè)prev,jdk源碼加了
自己寫(xiě)的鏈表debug報(bào)空指針,直接運(yùn)行正常。
慕粉1145407289
2019-07-13 19:22:48