`
quyang
  • 浏览: 3277 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

java拾遗录3

阅读更多

java拾遗录3

主题:java与链表不能不说的秘密

一、关于单向链表

关于链表和数组的讨论,是所有数据结构中所必提的,java自己封装了一些集合类,我们自己不需要去创建什么链表,但是作为一个基本能力,大家还是要有所了解的,下面的代码就是一个简单的单向链表,至于其他类型的链表将在后面一一展示出来。

 

创建节点类

/**
 *@作者  qy
 *@时间版本  版本1 下午04:53:15 2011-8-29
 */
public class Node
{
	public Node next;
	public  Object value;
	public Node(Object value,Node next)
	{
		this.value = value;
		this.next = next;
	}
	@Override
	public String toString()
	{
		return value.toString();
	}
	@Override
	public boolean equals(Object obj)
	{
		return obj.toString().equals(value.toString());
	}
}

 

创建链表 实现增删改查 功能

 

package array;
/**
 *@作者  qy
 *@时间版本  版本1 下午04:56:46 2011-8-29
 */
public class NodeToTest
{
	public Node head;
	/**
	 * 初始化链表
	 * 用对象数组遍历创建
	 * @param objects
	 */
	
	public NodeToTest(Object[] objects)
	{
		
		for (int i = objects.length-1; i >= 0; i--)
		{
			head = new Node(objects[i], head);
		}
	}
	//空构造
	public NodeToTest()
	{
	}
	
	//首端插入
	public void insertByFrist(Node newNode)
	{
		head = new Node(newNode, head);
	}
	
	//尾端插入
	public void insertByLast(Node newNode)
	{
		if(head == null)
		{
			head = newNode;
		}
		else 
		{
			Node temp = head;
			while(temp.next != null)
			{
				temp = temp.next;
			}
			temp.next = newNode;
		}
	}
	
	
	//按照项数删除 删除头项数为0
	public void deleteByIndex(int index)
	{
		Node temp = head;
		if (head == null)
		{
			System.out.println("链表为空");
			return;
		}
		if(index == 0)
		{
			head = head.next;
			return;
		}
		while(temp.next != null)
		{
			if(index == 1)
			{
				temp.next = temp.next.next;
				return ;
			}
			temp = temp.next;
			index--;
		}
	}
	
	//按照对象删除
	public void deleteByValue(Node deleteNode)
	{
		Node temp = head;
		if (head == null)
		{
			System.out.println("链表为空");
			return;
		}
		if(head.equals(deleteNode))
		{
			head = head.next;
			return;
		}
		while(temp.next != null)
		{
			if (temp.next.equals(deleteNode) )
			{
				temp.next = temp.next.next;
				return;
			}
			temp = temp.next;
		}
	}
	
	//插入
	public void insertByIndex(int index,Node newNode)
	{
		if(index == 0||head == null)
		{
			this.insertByFrist(newNode);
		}
		else 
		{
			Node temp = head;
			while(temp != null)
			{
				if(index == 1)
				{
					newNode.next = temp.next;
					temp.next = newNode;
					return;
				}
				temp = temp.next;
				index--;
			}
		}
	}
	
	//返回链表大小
	public int size()
	{
		Node temp = head;
		int i = 0;
		while(temp != null)
		{
			i++;
			temp = temp.next;
		}
		return i;
	}
	
	//方便显示当前链表的内容
	@Override
	public String toString()
	{
		String string = "{";
		Node temp = head;
		while(temp != null)
		{
			string += "["+temp.value.toString()+"],";
			temp = temp.next;
		}
		return string+"}";
	}
	
}

 

  测试类

 

package test;

import array.Node;
import array.NodeToTest;

/**
 *@作者  qy 
 *@时间版本  版本1 下午05:04:44 2011-8-29
 */
public class Test4array
{
	public static void main(String[] args)
	{
		Integer[] array = {1,2,3,4,5,6};
		NodeToTest nodeToTest = new NodeToTest((Object[])array);
		System.out.println(nodeToTest);
		//插入测试
		Node node = new Node(7, null);
		nodeToTest.insertByFrist(node);
		System.out.println(nodeToTest);
//		nodeToTest.insertByLast(node);
//		System.out.println(nodeToTest);
		
		//删除测试
//		nodeToTest.deleteByIndex(3);
//		System.out.println(nodeToTest);
		nodeToTest.deleteByValue(new Node(2, null));
		System.out.println(nodeToTest);
		//测试按位插入
		nodeToTest.insertByIndex(2, new Node(2, null));
		System.out.println(nodeToTest);
	}
}
 

这些就是简单的一个单向链表。

 

对了,还有特别注意:

很多书上都说:链表在插入删除上要比数组快。这句话在理论上是没错的,但其实这只是理论,删除和插入之前都必须先找到位置,这个花费的时间可不是一点半点,所以........

 

二、带表头的双向链表

链表还有很多形式,譬如带表头的单向链表,双向链表,带表头的双向链表,带尾指针的......不过大部分操作都是一样的,所以来一个带表头的双向链表就好了。

package array;
/**
 *@作者  qy
 *@时间版本  版本1 下午07:11:50 2011-8-30
 */
public class ArrayToTest1
{
	public Node1 head = new Node1();
	public Node1 tail = head;
	public ArrayToTest1(Object[] array)
	{
		for (int i = 0; i < array.length; i++) 
		{
			tail.next = new Node1(array[i],tail,null);
			tail = tail.next;
		}
	}
	public  void showByHead()
	{
		Node1 temp = head;
		while (temp.next != null)
		{
			System.out.println(temp.next.value);
			temp = temp.next;
		}
	}
	
	public  void showByTail()
	{
		Node1 temp = tail;
		while (temp != head)
		{
			System.out.println(temp.value);
			temp = temp.previous;
		}
	}
	public static void main(String[] args)
	{
		Integer[] array = {1,2,3,4,5};
		ArrayToTest1 arrayToTest1 = new ArrayToTest1(array);
		arrayToTest1.showByTail();
	}
	
	
}
 操作什么的就自己想吧,哈哈哈
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics