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