java手工实现双向链表结构

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值