10,java雙向鏈表基礎代碼復現
雙向鏈表總體來說和單鏈表差別不大,最大的區別就是node結構中多了一個pre指針(變量)指向前一個節點,因為有了之前的單鏈表基礎,雙向鏈表的復現問題少了很多,基本可以不參考老師的代碼自主寫下來。
1、添加函數(加入到鏈表最后)
因為此處的添加只需加到最后即可,按照單鏈表的添加,遍歷到最后并更改輔助節點的next指向node和node的pre指向temp即可。
public void add(teamNode1 node){ teamNode1 temp=head; while(true){ if(temp.next==null) break; temp=temp.next; } temp.next=node; node.pre=temp; }
2、顯示函數(打印出鏈表內的所有節點)
今天測試的時候發現昨天好像寫錯了- -,今天發現最后一個節點的信息無法被打印。后來發現,判斷next為null的語句不同于其他函數,此處應該放在輸出語句之后,后移語句之前。
public void list(){ if(head.next==null){ System.out.println("鏈表為空"); return; } teamNode1 temp=head.next; while (true){ System.out.println(temp); if(temp.next==null) break; temp=temp.next; } }
3、更新函數 與單鏈表的修改函數完全一致
public void update(teamNode1 node){ teamNode1 temp=head; boolean flag=false; while (true){ if(temp.next==null) break; if(temp.no==node.no){ flag=true; break; } temp=temp.next; } if(flag){ temp.name=node.name; temp.point=node.point; }else { System.out.println("未找到要修改的隊伍"); } }
4、刪除函數
此處與單鏈表有較大不同,雙向鏈表可實現自我刪除,遍歷到要刪除的節點即可,而非要刪的節點的前一個節點。但有個要注意的就是當要刪除的函數為鏈表最后一個函數時,temp的next節點l為空,沒有pre指針,也無法將pre指向node,所以在修改前要先判斷。
public void delete(int n){ if(head.next==null) { System.out.println("鏈表為空無法刪除"); return ; } boolean flag=false; teamNode1 temp=head; while(true){ if(temp.next==null) break; if(temp.no==n){ flag=true; break; } temp=temp.next; } if(flag&&temp.next!=null){ temp.pre.next=temp.next; temp.next.pre=temp.pre; }else if(flag){ temp.pre.next=temp.next; }else { System.out.println("未找到該位置隊伍,無法刪除"); } }
5、按順序加入函數 雙向鏈表addbyorder
思路和單鏈表的按順序插入相似,此處的加入到中間,需要先用temp.next.no> node.no找到應該插入的位置與插入位置前一個節點的temp,然后從后往前更改,先更改temp的next節點即要插入位置的后一個節點名為last,將它的pre指向node。然后更改node的next指向last,更改node的pre指向temp,最后更改temp的next指向node。這是比較順的思路,不會導致有用的信息被覆蓋掉。
另外的,與刪除鏈表相對應,此處要多考慮一種加入時要加入到鏈表尾部時的情況,相對于上面的情況,就不存在last這個節點了,因此不用修改node的next和last的pre。
因為情況比較多,我放棄了布爾值的標識符,用int的標識符,賦予123值來區分情況,1為需要插入,即前后都有節點,2為鏈表中已有該編號隊伍,0為遍歷到最后發現沒有編號大于他的節點,也沒有等于它的節點,所以就是要加在結尾。
public void addbyorder(teamNode1 node){ teamNode1 temp=head; int flag=0; while (true){ if (temp.next==null) break; if(temp.next.no== node.no){ flag=2; break; } if (temp.next.no> node.no){ flag=1; break; } temp=temp.next; } if(flag==1){ temp.next.pre=node; node.next=temp.next; node.pre=temp; temp.next=node; }else if(flag==0){ temp.next=node; node.pre=temp; }else { System.out.println("已有該隊伍"); } }

浙公網安備 33010602011771號