【数据结构与算法】java链表操作

链表操作代码量少但是比较容易出错,是比较适合面试的地方。

  • 代码实现

/**
 * 源码名称:MyLinkList.java
 * 日期:2014-09-05
 * 程序功能:java链表操作
 * 版权:[email protected]
 * 作者:A2BGeek
 */
import java.util.Stack;

public class MyLinkList {
	class LinkNode<T> {
		private T mValue;
		private LinkNode<T> mNext;

		public LinkNode(T value) {
			// TODO Auto-generated constructor stub
			mValue = value;
		}

		public void setValue(T value) {
			mValue = value;
		}

		public T getValue() {
			return mValue;
		}

		public void setNext(LinkNode<T> next) {
			mNext = next;
		}

		public LinkNode<T> getNext() {
			return mNext;
		}
	}

	// head node
	LinkNode<Integer> mHead = null;
	int mSize;

	// add
	public void add(int value) {
		LinkNode<Integer> newNode = new LinkNode<Integer>(value);
		newNode.setNext(null);
		if (mHead == null) {
			mHead = newNode;
		} else {
			LinkNode<Integer> tmp = mHead;
			while (tmp.getNext() != null) {
				tmp = tmp.getNext();
			}
			tmp.setNext(newNode);
		}
		mSize++;
	}

	// insert
	public void insert(int index, int value) {
		LinkNode<Integer> newNode = new LinkNode<Integer>(value);
		if (mHead == null) {
			newNode.setNext(null);
			mHead = newNode;
			mSize++;
		} else {
			if (index > mSize - 1) {
				System.out.println("index out of bound");
			} else {
				int j = 0;
				LinkNode<Integer> tmp = mHead;
				while (j < index) {
					tmp = tmp.getNext();
					j++;
				}
				newNode.setNext(tmp.getNext());
				tmp.setNext(newNode);
				mSize++;
			}
		}
	}

	// delete
	public void deleteByIndex(int index) {
		if (mHead == null) {
			System.out.println("linklist empty");
		} else {
			if (index > mSize - 1) {
				System.out.println("index out of bound");
			} else if (index == 0) {
				mHead = mHead.getNext();
			} else {
				int j = 0;
				LinkNode<Integer> pretmp = mHead;
				while (j < index - 1) {
					pretmp = pretmp.getNext();
					j++;
				}
				pretmp.setNext(pretmp.getNext().getNext());
			}
		}
	}

	public void deleteByValue(int value) {
		if (mHead == null) {
			System.out.println("linklist empty");
		} else {
			LinkNode<Integer> pretmp = null;
			LinkNode<Integer> tmp = mHead;
			while (tmp != null) {
				if (tmp.getValue() != value) {
					pretmp = tmp;
					tmp = tmp.getNext();
				} else {
					break;
				}
			}
			if (tmp == null) {
				System.out.println("not found");
			} else if (pretmp == null) {
				mHead = tmp.getNext();
			} else {
				pretmp.setNext(tmp.getNext());
			}
		}

	}

	// reverse
	public void reverse() {
		LinkNode<Integer> tmp = mHead;
		LinkNode<Integer> pretmp = null;
		LinkNode<Integer> nexttmp = null;
		while (tmp != null) {
			nexttmp = tmp.getNext();
			tmp.setNext(pretmp);
			pretmp = tmp;
			tmp = nexttmp;
		}
		mHead = pretmp;
	}

	// print_recursive
	public void printR(LinkNode<Integer> start) {
		if (start == null) {
			return;
		} else {
			System.out.print(start.getValue() + " ");
			printR(start.getNext());
		}
	}

	// print_norecursive
	public void printNor(LinkNode<Integer> start) {
		if (start == null) {
			System.out.println("linklist empty");
		} else {
			LinkNode<Integer> tmp = start;
			while (tmp != null) {
				System.out.print(tmp.getValue() + " ");
				tmp = tmp.getNext();
			}
		}
	}

	// printreverse_recursive
	public void printRR(LinkNode<Integer> start) {
		if (start == null) {
			return;
		} else {
			printRR(start.getNext());
			System.out.print(start.getValue() + " ");
		}
	}

	// printreverse_norecursive
	public void printRNor(LinkNode<Integer> start) {
		if (start == null) {
			System.out.println("linklist empty");
		} else {
			Stack<LinkNode<Integer>> stack = new Stack<LinkNode<Integer>>();
			LinkNode<Integer> tmp = start;
			while (tmp != null) {
				stack.push(tmp);
				tmp = tmp.getNext();
			}
			while (!stack.isEmpty()) {
				System.out.print(stack.pop().getValue() + " ");
			}
		}
	}

	public static void main(String[] args) {
		MyLinkList myLinkList = new MyLinkList();
		myLinkList.add(1);
		myLinkList.add(2);
		myLinkList.add(3);
		myLinkList.add(4);
		myLinkList.add(5);
		myLinkList.insert(3, 6);
		System.out.println("linklist size is " + myLinkList.mSize);
		myLinkList.printR(myLinkList.mHead);
		System.out.println();
		myLinkList.deleteByIndex(0);
		myLinkList.printNor(myLinkList.mHead);
		System.out.println();
		// myLinkList.reverse();
		// myLinkList.printRR(myLinkList.mHead);
		// System.out.println();
		// myLinkList.printRNor(myLinkList.mHead);
	}
}
时间: 2024-08-08 05:36:46

【数据结构与算法】java链表操作的相关文章

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

JAVA 链表操作:循环链表

主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.cnblogs.com/xiaoxing/p/5969133.html 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycleLinkLi

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

数据结构与算法(三)--链表

一.链表 单项链表.循环链表.双向链表 链表和数组不同,链表的每个元素都存储了下一个元素的地址,所以链表不需要连续的存储空间: 如果我们申请一个 100MB 大小的数组,当内存中没有连续的.足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败. 1.单链表:内存块称为链表的"结点",把这个记录下个结点地址的指针叫作后继指针 next 头结点用来记录链表的基地址.有了它,我们就可以遍历得到整条链表.而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址

数据结构与算法-单向链表

概述 由于最近在工作中需要用到树形结构来解决一些问题,所以萌生了系统学习“数据结构和算法”的想法,于是乎从最简单的表结构开始.由于数组是最简单的表结构的实现,也是各个编程语言内置的数据类型,所以不做更多的记录.表结构中以下实现打算学习: LinkedList Stack Queue HashTable Dictionary 本篇为学习数据结构的第一篇随笔,从最简单的单向链表开始吧. 实现(C#) 平台:dotNet Core 1.0, C# IDE:VSCode 如果考虑算法复用的话,可以实现泛

数据结构和算法(Java版)

主要内容:(内容来自互联网以及李刚著作的<突破程序员基本功的16课>) 1.数据结构:线性表.栈.队列.树&二叉树 2.算法:常用内部排序(选择.插入.交换.归并) 目录: 1. 线性表(顺序存储.链式存储单链表.双向链表)-------------2014/10/15 2. 栈(顺序栈.链栈)                                        -------------2014/10/15 线性表(顺序存储.链式存储):一对一松耦合关系.(List就是线性

JAVA 链表操作:单连表和双链表

主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链条串联一起,轻易的可以实现数据的访问. 二.链表实现原理和必要性 这里只分析单链表和双链表.链表的实现过程是有些许复杂的,但是会带来许多好处.比如现在网购时代到来,商家发快递一般会将商品包装在盒子里并写上地址信息,快递

数据结构与算法三(链表)

一.链表 1.什么是链表 和数组一样,链表也是一种线性表 从内存结构上看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构 链表中的每一个内存块被称为节点Node,节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next 2.常见的缓存策略 先进先出策略FIFO (First In,First Out) 最少使用策略LFU (Least Frequently Used) 最近最小使用策略LRU(Least Recently Used) 3.常

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始