双端链表和双向链表
一、什么是双端链表。
链表中保存着对最后一个链节点引用的链表。
二、从头部进行插入
要对链表进行判断,如果为空则设置尾节点为新添加的节点。
三、从尾部进行插入
如果链表为空,则直接设置头结点为新添加的节点,否则设置尾节点的后一个节点为新添加节点。
四、从头部进行删除
判断头结点是否为下一个结点,如果没有则设置为结点为null。
双端链表的好处就是可以从尾结点进行添加
public class Node { public long data; public Node next; public Node(long value){ this.data=value; } public void display(){ System.out.print(this.data+", "); } } //双端链表 public class FirstLastLinkList { private Node first; private Node last; public FirstLastLinkList(){ first=null; last=null; } /* * 从头结点开始插入 * */ public void insertFirst(long value){ Node newnode=new Node(value); if(isEmpty()){ last=newnode; } newnode.next=first; first=newnode; } /* * 从尾结点开始插入 * */ public void insertLast(long value){ Node newnode=new Node(value); if(isEmpty()){ first=newnode; }else{ last.next=newnode; } last=newnode; } /* * 从头结点开始删除 * */ public void deleteFirst(){ if(first.next==null){ last=null; } first=first.next; } /* * 从尾结点开始删除 * */ public void deleteLast(){ if(first.next==null){ last=null; } } /* * 查找节点,结果返回布尔值 * */ public boolean find(long value){ Node current=first; if(current!=null){ while(current.data!=value){ if(current.next==null){ return false; } current=current.next; } if(current.data==value){ return true; } }else{ return false; } return false; } /* * 查找方法,结果返回值 * */ public Node findvalue(long value){ Node current=first; while(current.data!=value){ if(current.next==null){ return null; } current=current.next; } return current; } /* * 根据数据删除结点,成功则返回true * */ public boolean deleteNode(long value){ if(first==null) { return false; } if(find(value)){//先要确定是否存在要删除的数据 Node current=first; Node previous=first; while(current.data!=value){ if(current.next==null){ return false; } previous=current; current=current.next; } previous.next=current.next;//将结点删除 return true; }else{ return false; } } /* * 删除方法,根据数据域来进行删除,结果返回被删除数据 * */ public Node delete(long value){ Node current=first; Node previous=first; while(current.data!=value){ if(current.next==null){ return null; } previous=current; current=current.next; } if(current==first){//如果是第一个节点 first=first.next; }else{ previous.next=current.next; } return current; } /* * 显示方法 * */ public void display(){ Node current=first; while(current!=null){ current.display(); current=current.next; } } /* * 判断是否为空链表 * */ public boolean isEmpty(){ return (first==null); } } public class TestFirstLastLinkList { public static void main(String[] args){ FirstLastLinkList fl=new FirstLastLinkList(); //从头结点开始插入数据 fl.insertFirst(1); fl.insertFirst(2); fl.insertFirst(5); fl.insertFirst(8); //从尾结点开始插入数据 fl.insertLast(5); fl.insertLast(10); fl.insertLast(0); fl.display(); //查找成功返回true System.out.println(fl.find(0)); /*从头结点开始删除 while(!fl.isEmpty()){ fl.deleteFirst(); fl.display(); }*/ System.out.println(fl.deleteNode(0)); fl.display(); } }
双向链表
一、什么是双向量表。
每个结点除了保存了对下一个结点的引用,同时还保存着对前一个结点的引用。
二、从头部进行插入
要对链表进行判断,如果为空则设置尾结点为新添加的节点。如果不为空,还需要设置头结点的前一个结点为新添加的结点。
三、从尾部进行插入
如果链表为空,则直接设置头结点为新添加的结点,否则设置尾结点的后一个结点为新添加节点。同时设置新添加的结点的前一个节点为尾结点。
四、从头部进行删除
判断头结点是否有下一个结点,如果没有则设置为结点为null。否则设置头结点的下一个结点为previous为null。
五、从尾部进行删除
如果头结点后没有其他节点,则设置尾节点为null。否则设置尾节点前一个结点的next为null。设置尾结点为其前一个节点。
六、删除方法。
不需要再使用一个临时的指针域。
public class Node { //数据域 public long data; //指针域 public Node next; public Node previous; public Node(long value){ this.data=value; } /* * 显示方法 * */ public void display(){ System.out.print(data+" "); } } public class DoubleLinkList { //头结点 private Node first; //尾节点 private Node last; public DoubleLinkList(){ first=null; } /* * 插入一个节点,在头结点后进行插入 * */ public void insertFirst(long value){ Node node=new Node(value); if(isEmpty()){ last=node; }else{ first.previous=node; } node.next=first; first=node; } /* * 插入一个节点,从尾节点进行插入 * * */ public void insertLast(long value){ Node node=new Node(value); if(isEmpty()){ first=node; }else{ last.next=node; node.previous=last; } last=node; } /* * 删除一个节点,在头结点后进行删除 * */ public Node deleteFirst(){ Node tmp=first; if(first.next==null){ last=null; }else{ first.next.previous=null; } first=tmp.next; return tmp; } /* * 删除结点,从尾部进行删除 * */ public Node deleteLast(){ Node tmp=last; if(first.next==null){ first=null; }else{ last.previous.next=null; last=last.previous; } return last; } /* * 显示方法 * */ public void display(){ Node current=first; while(current!=null){ current.display(); current=current.next; } System.out.println(); } /* * 查找方法 * */ public Node find(long value){ Node current=first; while(current.data!=value){ if(current.next==null){ return null; } current=current.next; } return current; } /* * 删除方法,根据数据域来进行删除 * */ public Node delete(long value){ Node current=first; while(current.data!=value){ if(current.next==null){ return null; } current=current.next; } if(current==first){//如果是第一个节点 first=first.next; }else{ current.previous.next=current.next; } return current; } /* * 判断是否为空 * * */ public boolean isEmpty(){ return (first==null); } } public class TestDoubleLinkList { public static void main(String[] args){ DoubleLinkList dl=new DoubleLinkList(); dl.insertLast(45); dl.insertLast(56); dl.insertLast(90); dl.display(); //删除尾部结点 dl.deleteLast(); dl.display(); while(!dl.isEmpty()){ dl.deleteLast(); dl.display(); } } }