Java-容器之单链表

Java-容器之单链表

一、概念:

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的

每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

二、模型

Java-容器之单链表_第1张图片

模型中只添加了3个节点。

其中有两个类:节点类(Node)、链表类(ListNode)。

节点类:

public class Node{
	public Object obj;			//数据域
	public Node next = null;	//下一个节点指针
	
	//构造方法
	Node(Object obj){
		this.obj = obj;
	}
}
链表类:

public class ListNode {
	
	private Node first = null; // 头指针
	...
}

三、基本操作

1、在头指针处插入一个节点

代码:

	// 在链表头部插入一个对象
	public void insertFirst(Object obj) {
		Node temp = first;
		first = new Node(obj);
		first.next = temp;
	}
首先需要一个引用(temp),用于保存第一个对象:

Node temp = first;

Java-容器之单链表_第2张图片

再first指向新建的对象(0):

first = new Node(obj);
Java-容器之单链表_第3张图片

将对象0链接到主链上:

first.next = temp;
Java-容器之单链表_第4张图片
插入完成!

2、在头指针处删除一个节点:

代码:
	// 删除链表头部的一个对象
	public boolean deleteFirst() throws Exception {
		// 异常处理
		if (first == null)
			throw new Exception("empty!");
		// 指向下一个节点
		first = first.next;
		return true;
	}
将头指针指向下一个节点指向的位置
first = first.next;
Java-容器之单链表_第5张图片
Java-容器之单链表_第6张图片
删除完成!

3、查找一个对象是否存在

代码:
	// 查找一个对象是否存在
	public boolean find(Object obj) throws Exception {
		// 异常处理
		if (first == null)
			throw new Exception("empty!");
		// 查找指针,从头指针开始依次向后查找
		Node pos = first;
		while (pos != null) {
			if (pos.obj.equals(obj))
				return true;
			// 查找指针后移
			pos = pos.next;
		}
		return false;
	}
建立查找指针:
Node pos = first;
Java-容器之单链表_第7张图片
当Pos指向的对象不是所查找的对象时,Pos后移:
while (pos != null) {
	if (pos.obj.equals(obj))
		return true;
	// 查找指针后移
	pos = pos.next;
	}
Java-容器之单链表_第8张图片
当找到所要查找的节点时,直接返回true,无需再继续查找。

4、移除一个对象

代码:
// 移除一个对象
	public boolean remove(Object obj) throws Exception {
		if (first == null)
			throw new Exception("empty!");
		// 头指针就是移除对象
		if (first.obj.equals(obj)) {
			first = first.next;
			return true;
		} 
		else {
			Node ptr = first; // 保存寻找指针的上一个节点
			Node pos = first.next; // 寻找指针
			while (pos != null) {
				// 找到移除对象
				if (pos.obj.equals(obj)) {
					// 将移除对象的上一个节点指向移除对象的下一个节点
					ptr.next = pos.next;
					return true;
				}
				// 两个指针后移
				ptr = pos;
				pos = pos.next;
			}
			return false;
		}
	}
当移除的对象是头指针指向的对象时,移除过程和2一致。当移除对象不是头指针指向的对象时:
创建搜索指针(pos)和保存上一节点指针(ptr):
Node ptr = first; // 保存寻找指针的上一个节点
Node pos = first.next; // 寻找指针
Java-容器之单链表_第9张图片
当Pos指向的对象不是需要删除的对象时,两个指针后移:
// 两个指针后移
ptr = pos;
pos = pos.next;
Java-容器之单链表_第10张图片
当pos指向的对象是被删除的对象时,将ptr的next指向pos的下一个对象:
// 将移除对象的上一个节点指向移除对象的下一个节点
ptr.next = pos.next;
Java-容器之单链表_第11张图片
Java-容器之单链表_第12张图片
删除完成!

5、判断链表是否为空

代码:
	// 判断链表是否为空
	public boolean isEmpty() {
		return (first == null);
	}

6、打印链表

代码:
	// 输出链表
	public void display() {
		if (first == null)
			System.out.println("empty");
		Node pos = first;
		while (pos != null) {
			System.out.print(pos.obj.toString() + " -> ");
			pos = pos.next;
		}
		System.out.print("\n");
	}

四、源代码

1、Node类

public class Node{
	public Object obj;			//数据域
	public Node next = null;	//下一个节点指针
	
	//构造方法
	Node(Object obj){
		this.obj = obj;
	}
}

2、ListNode类

public class ListNode {
	
	private Node first = null; // 头指针
	
	// 在链表头部插入一个对象
	public void insertFirst(Object obj) {
		Node temp = first;
		first = new Node(obj);
		first.next = temp;
	}

	// 删除链表头部的一个对象
	public boolean deleteFirst() throws Exception {
		// 异常处理
		if (first == null)
			throw new Exception("empty!");
		// 指向下一个节点
		first = first.next;
		return true;
	}

	// 查找一个对象是否存在
	public boolean find(Object obj) throws Exception {
		// 异常处理
		if (first == null)
			throw new Exception("empty!");
		// 查找指针,从头指针开始依次向后查找
		Node pos = first;
		while (pos != null) {
			if (pos.obj.equals(obj))
				return true;
			// 查找指针后移
			pos = pos.next;
		}
		return false;
	}

	// 移除一个对象
	public boolean remove(Object obj) throws Exception {
		if (first == null)
			throw new Exception("empty!");
		// 头指针就是移除对象
		if (first.obj.equals(obj)) {
			first = first.next;
			return true;
		} 
		else {
			Node ptr = first; // 保存寻找指针的上一个节点
			Node pos = first.next; // 寻找指针
			while (pos != null) {
				// 找到移除对象
				if (pos.obj.equals(obj)) {
					// 将移除对象的上一个节点指向移除对象的下一个节点
					ptr.next = pos.next;
					return true;
				}
				// 两个指针后移
				ptr = pos;
				pos = pos.next;
			}
			return false;
		}
	}

	// 判断链表是否为空
	public boolean isEmpty() {
		return (first == null);
	}

	// 输出链表
	public void display() {
		if (first == null)
			System.out.println("empty");
		Node pos = first;
		while (pos != null) {
			System.out.print(pos.obj.toString() + " -> ");
			pos = pos.next;
		}
		System.out.print("\n");
	}
}

测试主函数:

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ListNode list = new ListNode();
		for (int i = 0; i < 10; i++)
			list.insertFirst(i);
		list.display();
	}
}

测试输出: 

Java-容器之单链表_第13张图片


你可能感兴趣的:(Java学习日志)