1.对于链表结构,主要有单向链表和双向链表之分,这里讨论的是双向链表,即节点中有两个应用,left引用指向前一个节点,right引用指向后面一个节点。下面是一个简单的链表:
2.代码实现链表节点结构
package com.lwk.linked; /** * @author 李卫康 * @version 创建时间:2017年7月11日 下午9:11:21 * 类说明:链表结构 (单行和双向) */ public class Node { private int data; public Node left;//链表结构的前面引用 public Node right;//链表结构的后面引用 public Node(int data) { this.data=data; } public int getData(){ return data; } } 3.代码实现链表的头部添加、尾部添加、指定索引添加
package com.lwk.linked; /** * @author 李卫康 * @version 创建时间:2017年7月11日 下午9:14:48 * 类说明: */ public class OvonicLinked { private Node first;//定义链表结构的头 private Node tail;//定义链表结构的尾 private int size;//记录链表的大小 public OvonicLinked() { first=null; tail=null; } /** * 头部添加节点 * @param data */ public void addHeadNode(int data){ Node newNode=new Node(data);//创建新节点 if(first==null){//如果头结点为空,就把新创建的节点赋值给first头节点 first=newNode; }else{//头节点不为空,则在头节点的左边添加节点 //让头节点的left指向newNode first.left=newNode; //新节点的right指向first newNode.right=first; //如果first节点的右边没有数据则让tail引用指向first if(first.right==null){ tail=first; } //将first引用指向newNode first=newNode; } size++; } /** * 尾部添加数据 * @param data */ public void addTailNode(int data){ Node newNode=new Node(data); if(first==null){ first=newNode; }else{ tail.right=newNode; newNode.left=tail; if(tail.left==null){ first=tail; } //将tail引用指向newNode tail=newNode; } size++; } /** * 在指定位置添加节点 * @param index * @param data */ public void addIndexNode(int index,int data){ if(index>=size){ throw new RuntimeException("插入越界异常"); } Node newNode=new Node(data);//新节点 Node currentNode=first;//头节点 Node nextNode=null;//索引位置的下一个节点,即要插入的索引的下一位 if(first==null){ //如果为null,则肤质 first=newNode; }else if(index==size-1){//如果插入的节点为尾部后面,则调用插入尾部的方法 addTailNode(data);//尾部添加节点 }else{ //其他情况 int i=0; while(currentNode!=null){ currentNode=currentNode.right; i++; if(i==index){ nextNode=currentNode.right;//找出下一个节点 break; } } //断开旧节点,插入新节点 newNode.right=nextNode; nextNode.left=newNode; currentNode.right=newNode; newNode.left=currentNode; } size++; } public int size(){ return size; } /** * 显示数据 */ public void display(){ if(first==null){//如果链表没有数据则提示 System.out.println("链表中没有数据"); }else{ Node currentNode=first; while(currentNode!=null){ System.out.print(currentNode.getData()+" "); currentNode=currentNode.right; } } } public static void main(String[] args) { OvonicLinked ovonicLinked=new OvonicLinked(); ovonicLinked.addHeadNode(3); ovonicLinked.addHeadNode(4); ovonicLinked.addTailNode(5); ovonicLinked.addIndexNode(1,6); ovonicLinked.display(); } } 测试结果:
注意:在实现链表结构时,要注意链表的头headh和尾tail,要考虑多种情况。建议一边画图一边思考节点与节点之间的关系。
1.指定添加索引添加节点方法中:
(1)判断了头部节点是否为空
(2)判断了添加的索引位置是否为最后一个节点位置
(3)在链表内部插入节点
2.添加头部节点方法中:
(1)考虑头部节点是否为空
(2)头部节点不为空,则在头部左边插入,并判断头部节点的right是否有数据,如果没有数据则tail引用指向first
3.添加尾部节点方法中:
(1)考虑头部节点是否为空
(2)头部节点不为空,则在尾部的右边插入,并判断尾部的left是否有数据,如果没有数据则first 引用指向tail
