本文共 4751 字,大约阅读时间需要 15 分钟。
简单的说一下单链表与双链表的区别:
单链表:单链表有一个指针和一个数据域,所以单链表只能通过这一个指针进行正向的访问节点的数据,操作简单。
双链表:除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以通过前指针快速找到前一结点,但多了一个指针,所以需要的存储空间大于单链表,同时具有从双向链表中的任意一个结点开始,都可以很方便地访问前驱结点和后继结点。
适用场景
单向链表更适合元素的增加与删除,双向链表更适合元素的查询工作。代码也就不多解释都有注释的
package List;/** * @author ganxiang * IDE IntelliJ IDEA * @project_name and filename JavaDemo DoubleList * @date 2020/02/25 0025 09:50 */public class DoubleList { class DefineDoubleNode{ int data; DefineDoubleNode pre; DefineDoubleNode next; public DefineDoubleNode(){ //初始化链表 this.data=0; this.pre =null; this.next=null; } public DefineDoubleNode (int data){ this.data=data; }//初始化链表 public int getData(){ return data; }//获取节点数据 public void setData(int data){ this.data =data; }//设置节点数据 public DefineDoubleNode getPre(){ return pre; }//获取前驱节点地址 public void setPre(DefineDoubleNode pre){ this.pre=pre; }//设置前驱节点地址 public DefineDoubleNode getNext(){ return this.next; }//获取下一个节点地址 public void setNext(DefineDoubleNode next){ this.next =next; }//设置下一个节点的地址 } public void printList(DefineDoubleNode ahead){ //正向遍历链表 while (ahead!=null){ System.out.print(ahead.getData()); System.out.print(" "); ahead=ahead.getNext(); } } public void reversePrintList(DefineDoubleNode head){ //反向遍历链表 DefineDoubleNode ahead =head; while (ahead.getNext()!=null){ ahead =ahead.getNext(); } while (ahead!=null){ System.out.print(ahead.getData()); System.out.print(" "); ahead =ahead.getPre(); } } public int getLength(DefineDoubleNode head){ //计算链表长度 int len=0; while (head!=null){ len++; head =head.getNext(); } return len; } DefineDoubleNode head=null;//这个head节点之后都是对他操作的,很重要 public DefineDoubleNode inset_many(DefineDoubleNode head){ //插入多个数据 DefineDoubleNode ahead=head ; for (int i=10;i<=15;i++){ if (ahead==null){ ahead =new DefineDoubleNode(i);// printList(t); } else{ DefineDoubleNode thead =ahead; while (thead.next!=null){ thead= thead.next; } DefineDoubleNode temp =new DefineDoubleNode(); temp.setData(i); temp.setPre(thead); thead.setNext(temp);// printList(ahead.next); } } return ahead; } public DefineDoubleNode addFirst(int data,DefineDoubleNode head){ //在头结点插入数据 DefineDoubleNode temp=new DefineDoubleNode(data); DefineDoubleNode ahead =head; if(ahead==null)ahead=temp; else{ temp.setPre(null); ahead.setPre(temp); temp.setNext(ahead); ahead =temp; } return ahead; } public DefineDoubleNode addLast(int data,DefineDoubleNode head){ //在尾节点插入数据 DefineDoubleNode ahead =head; DefineDoubleNode temp =new DefineDoubleNode(data); while (ahead.next!=null){ ahead =ahead.next; } temp.setPre(ahead); temp.setNext(null); ahead.setNext(temp); return head; } public DefineDoubleNode insert_index(int k,int data,DefineDoubleNode head){ //在指定的位置k插入数据 DefineDoubleNode ahead =head; if (k<1||k>getLength(ahead))System.out.println("不在操作范围!"); else if (k==1) return addFirst(data,ahead); else if (k==getLength(ahead)) return addLast(data,ahead); else { DefineDoubleNode newNode = new DefineDoubleNode(data); int count =1; DefineDoubleNode temp=ahead; while(countgetLength(ahead))System.out.println("不在操作范围!"); else if (k==1) return delFirst(ahead); else if (k==getLength(ahead)) return delLast(ahead); else { int count=1; DefineDoubleNode tmp=ahead; while (tmp.getNext()!=null&&count getLength(ahead))System.out.println("不在操作范围!"); else if (k==1) return update_First(data,ahead); else if (k==getLength(ahead)) return update_Last(data,ahead); else { DefineDoubleNode tmp =ahead; DefineDoubleNode newNode =new DefineDoubleNode(); int count =1; while (count
运行展示
更指定的数据 指定k=5 将第五个节点的数据更新为500 指定插入 指定k=5插入节点数据为300 指定删除 k=2的节点转载地址:http://hhqzi.baihongyu.com/