链表由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表有单链表和双端链表
现在来看插入元素的结果显示:每当有一个元素插入进来,都要是放在第一位的,那么这次的结果应该是:5《-4《-3《-2《-1
public static void main(String[] args){ SingleLinkList linkList = new SingleLinkList(); SingleLink link1 = new SingleLink(1); SingleLink link2 = new SingleLink(2); SingleLink link3 = new SingleLink(3); SingleLink link4 = new SingleLink(4); SingleLink link5 = new SingleLink(5); linkList.insertFirst(link1); linkList.insertFirst(link2); linkList.insertFirst(link3); linkList.insertFirst(link4); linkList.insertFirst(link5); linkList.displayList(); }//再来做删除的操作:
//删除第第一个元素: SingleLink link = linkList.deleteFirst(); System.out.println("打印删除的元素:"); link.displaySingleLink(); System.out.println("删除之后的元素打印:"); linkList.displayList();至此,单链表的练习就到此结束。
现在再介绍一个双端链表:和单链表的不同是,有一个指针会始终指向最后一个元素:
//设计双链表的数据结构 public class DoubleLinkList { private SingleLink first; private SingleLink last; public DoubleLinkList(){ first = last = null; } /** * 总是往前面插入元素 */ public void insertFirst(SingleLink newLink){ if(first==null){//说明list是空的,last永远是指向第一个节点 first = last =newLink; }else{//list中已经有元素了 newLink.next = first; first = newLink; } } /** * 总是往后面插入元素,需要注意最后一个元素永远要指向第一个 * @param newLink */ public void insertLast(SingleLink newLink){ if(first==null){ first = last =newLink; }else{//已经有元素的情况下:从last往前插入 last.next = newLink; } last = newLink;//将last的指针往后移动 } /** * 删除第一个元素 * @return */ public SingleLink deleteFirst(){ if(first ==null){ return null; } //在有元素的情况下,删除第一个元素 SingleLink current = first; first = first.next; return current; } /** * 删除最后一个元素。 * @return */ public void deleteLast(){ if(first ==null){//一个元素都没有 return; }else if(first.next==null){//只有一个元素 first = null; last = null; }else{//采用遍历的方式:遍历到最后一个元素 SingleLink current = first; while(current.next!=null){ if(current.next==last){//如果已经查找到最后一个元素 last = current; last.next = null; break; } current = current.next; } } } public void displayList() { SingleLink current = first;//指针指向first while (current != null) { current.displaySingleLink(); current = current.next; } } public void displayLast(){ if(first==null){ System.out.println("list 为空"); }else{ last.displaySingleLink(); } }再来验证设计的数据结构:
public static void main(String[] args) { DoubleLinkList linkList = new DoubleLinkList(); linkList.insertFirst(new SingleLink(1)); linkList.insertFirst(new SingleLink(2)); linkList.insertFirst(new SingleLink(3)); linkList.insertFirst(new SingleLink(4)); linkList.insertFirst(new SingleLink(5)); linkList.displayList(); linkList.displayLast(); }数据最后插入的排放在最前面并且知道最后一个元素就是第一个插入的元素
再来看混合插入和删除: public static void main(String[] args) { DoubleLinkList linkList = new DoubleLinkList(); linkList.insertLast(new SingleLink(1)); linkList.insertLast(new SingleLink(2)); linkList.insertLast(new SingleLink(3)); linkList.insertLast(new SingleLink(4)); linkList.insertFirst(new SingleLink(6)); linkList.insertLast(new SingleLink(5)); System.out.println("删除之前的集合元素是:"); linkList.displayList(); System.out.println("删除之后的集合元素是:"); linkList.deleteLast(); linkList.displayList(); System.out.println("最后一个元素:"); linkList.displayLast(); }再次查看结果: