public class DoubleLinkedListDemo { public static void main(String[] args) { DoubleLinkedList dList = new DoubleLinkedList(); HeroNode2 n1= new HeroNode2(1, "卢俊义", "玉麒麟"); HeroNode2 n5= new HeroNode2(5, "关胜", "大刀"); HeroNode2 n7= new HeroNode2(7, "秦明", "霹雳火"); HeroNode2 n9= new HeroNode2(9, "花荣", "小李广"); //测试添加 dList.add(n1); dList.add(n5); dList.add(n7); dList.add(n9); dList.showList(); //测试修改 HeroNode2 n18= new HeroNode2(5, "徐宁", "金枪手"); dList.update(n18); dList.showList(); //测试删除 // dList.del(1); // dList.del(5); // dList.del(7); // dList.del(9); // dList.showList(); //测试按编号添加 HeroNode2 n8= new HeroNode2(8, "呼延灼", "双鞭"); HeroNode2 n10= new HeroNode2(10, "柴进", "小旋风"); dList.addByOrder(n8); dList.addByOrder(n10); dList.showList(); } }
/** * 双向链表实现 * @author Administrator * */ class DoubleLinkedList{ private HeroNode2 head = new HeroNode2(0, "", ""); public HeroNode2 getHead() { return head; }
/** * 添加方法 * @param node */ public void add( HeroNode2 node ) { HeroNode2 temp = head; while(true) { if(temp.next == null) { break; } temp = temp.next; } temp.next = node; node.pre = temp; } /** * 按编号删除节点 * * 需要注意的地方主要是:尾部节点移除特殊化,因为最后一个节点的next会是null * 所以不处理会有空指针异常。还有需要注意的地方就是,链表操作时,其实最容易绕晕的地方就是节点的逻辑关系 * 实在想不明白,画图是理清思路的最好方式。 * * @param num */ public void del( int num ) { if( num == 0 ) { System.out.println( "=======头节点不能移除=======" ); return; } HeroNode2 temp = head; while (true) { if( temp.next == null && temp.no != num ) { System.out.println( "当前编号:"+ num +"记录不存在" ); break; } if( temp.no == num ) { temp.pre.next = temp.next; if( temp.next !=null ) { temp.next.pre = temp.pre; } break; } temp = temp.next; } } /** * 修改节点信息 * @param node */ public void update( HeroNode2 node ) { HeroNode2 temp = head; if( node == null ) { return; } while (true) { if( temp.no == node.no) { if( !temp.name.equalsIgnoreCase(node.name) ) { temp.name = node.name; } if( !temp.nickName.equalsIgnoreCase(node.nickName) ) { temp.nickName = node.nickName; } break; } temp = temp.next; } } /** * 显示列表 */ public void showList() { HeroNode2 temp = head; if( temp.next == null ) { System.out.println( "=====列表为空=====" ); return; } System.out.println( "=====================================" ); while(true) { if( temp == null ) { break; } System.out.println( temp ); temp = temp.next; } System.out.println( "=====================================" ); } /** * 按节点编号顺序添加节点 * */ public void addByOrder( HeroNode2 node ) { HeroNode2 temp = head.next; HeroNode2 pre = null; while (true) { if( temp == null ) { pre.next = node; break; } if( temp.no > node.no) { temp.pre.next = node; node.next = temp; break; } temp = temp.next; if( temp !=null ) { pre = temp; } } } }
class HeroNode2{ int no; String name; String nickName; HeroNode2 pre; HeroNode2 next;
public HeroNode2(int no,String name,String nickName) { this.no = no; this.name = name; this.nickName = nickName; }
@Override public String toString() { return "HeroNode2 [no=" + no + ", name=" + name + ", nickName=" + nickName + "]"; } }