`
baby69yy2000
  • 浏览: 187854 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

我的Java单链表练习

    博客分类:
  • Util
阅读更多
package LinkedList;

/**
 * <p><strong>我的Java单链表练习</strong></p>
 * <p>单链表提供了在列表头的高效插入和删除操作,不过在单链表的末尾的插入操作效率很低.</p>
 * <p>单链表指针域保存着下一节点的引用,尾结点的指针域等于null</p>
 * @author baby69yy2000
 */
public class SingleLinkedList<T> {
	
	/**
	 * 结点类
	 */
	private static class Node<T> {
		T nodeValue; // 数据域
		Node<T> next; // 指针域保存着下一节点的引用
		
		Node(T nodeValue, Node<T> next) {
			this.nodeValue = nodeValue;
			this.next = next;
		}
		
		Node(T nodeValue) {
			this(nodeValue, null);
		}
	}

	// 下面是SingleLinkedList类的数据成员和方法
	private Node<T> head, tail;
	
	public SingleLinkedList() {
		head = tail = null;
	}
	
	/**
	 * 判断链表是否为空
	 */
	public boolean isEmpty() {
		return head == null;
	}
	
	/**
	 * 创建头指针,该方法只用一次!
	 */
	public void addToHead(T item) {
		head = new Node<T>(item);
		if(tail == null) tail = head;
	}
	
	/**
	 * 添加尾指针,该方法使用多次
	 */
	public void addToTail(T item) {
		if (!isEmpty()) { // 若链表非空那么将尾指针的next初使化为一个新的元素
			tail.next = new Node<T>(item); // 然后将尾指针指向现在它自己的下一个元素
			tail = tail.next;
		} else { // 如果为空则创建一个新的!并将头尾同时指向它
			head = tail = new Node<T>(item);		
		}
	}
	
	/**
	 * 打印列表
	 */
	public void printList() {
		if (isEmpty()) {
			System.out.println("null");
		} else {
			for(Node<T> p = head; p != null; p = p.next)
				System.out.println(p.nodeValue);
		}
	}
	
	/**
	 * 在表头插入结点,效率非常高
	 */
	public void addFirst(T item) {
		Node<T> newNode = new Node<T>(item);
		newNode.next = head;
		head = newNode;
	}
	
	/**
	 * 在表尾插入结点,效率很低
	 */
	public void addLast(T item) {
		Node<T> newNode = new Node<T>(item);
		Node<T> p = head;
		while (p.next != null) p = p.next;
		p.next = newNode;
		newNode.next = null;
	}
	
	/**
	 * 在表头删除结点,效率非常高
	 */
	public void removeFirst() {
		if (!isEmpty()) head = head.next;
		else System.out.println("The list have been emptied!");
	}
	
	/**
	 * 在表尾删除结点,效率很低
	 */
	public void removeLast() {
		Node<T> prev = null, curr = head;
		while(curr.next != null) {
			prev = curr;
			curr = curr.next;
			if(curr.next == null) prev.next = null;
		}
	}
	
	/**
	 * <p>插入一个新结点</p>
	 * <ul>插入操作可能有四种情况:
	 * <li>①表为空, 返回false</li>
	 * <li>②表非空,指定的数据不存在</li>
	 * <li>③指定的数据是表的第一个元素</li>
	 * <li>④指定的数据在表的中间</li></ul>
	 * @param appointedItem 指定的nodeValue
	 * @param item 要插入的结点
	 * @return 成功插入返回true;
	 */
	public boolean insert(T appointedItem, T item) {
		Node<T>  prev = head, curr = head.next, newNode;
		newNode = new Node<T>(item);
		if(!isEmpty()) {
			while((curr != null) && (!appointedItem.equals(curr.nodeValue))) { //两个判断条件不能换
				prev = curr;
				curr = curr.next;
			}
			newNode.next = curr; //②③④
			prev.next = newNode;
			return true; 
		}
		return false; //①
	}
	
	/**
	 * <p>移除此列表中首次出现的指定元素</p>
	 * <ul>删除操作可能出现的情况:
	 * <li>①prev为空,这意味着curr为head. head = curr.next; --> removeFirst();</li>
	 * <li>②匹配出现在列表中的某个中间位置,此时执行的操作是 --> prev.next = curr.next;,</li></ul>
	 * <p>在列表中定位某个结点需要两个引用:一个对前一结点(prev左)的引用以及一个对当前结点(curr右)的引用.</p>
	 * prev = curr;
	 * curr = curr.next;
	 */
	public void remove(T item) {
		Node<T> curr = head, prev = null;
		boolean found = false;
		while (curr != null && !found) {
			if (item.equals(curr.nodeValue)) {
				if(prev == null) removeFirst();
				else prev.next = curr.next;
				found = true;
			} else {
				prev = curr;
				curr = curr.next;
			}
		}
	}
	
	/**
	 * 返回此列表中首次出现的指定元素的索引,如果列表中不包含此元素,则返回 -1.
	 */
	public int indexOf(T item) {
		int index = 0;
		Node<T> p;
		for(p = head; p != null; p = p.next) {
			if(item.equals(p.nodeValue))
				return index;
			index++;
				
		}
		return -1;
	}
	
	/**
	 * 如果此列表包含指定元素,则返回 true。
	 */
	 public boolean contains(T item) {
		 return indexOf(item) != -1;
	 }
	
	public static void main(String[] args) {
		SingleLinkedList<String> t = new SingleLinkedList<String>();
		t.addToHead("A");
		//t.addFirst("addFirst");
		t.addToTail("B");
		t.addToTail("C");
		System.out.println(t.indexOf("C")); // 2
		System.out.println(t.contains("A")); // true
		//t.addLast("addLast");
		//t.removeLast();
		//t.insert("B", "insert");
		//t.removeFirst();
		//t.remove("B"); // A C
		t.printList(); // A B C
		
	}

}

  • doc.rar (29.1 KB)
  • 下载次数: 36
分享到:
评论
4 楼 durong11 2014-05-05  
或者直接在函数的中加入:
if(head.data.equals(appointedItem)){
			addFromHead(item);
			return true;
		}

老肥猴_vi 写道
谢谢。但是貌似insert函数( public boolean insert(T appointedItem, T item) )有点问题呢, 如果appointedItem就是head,那么你写的的函数并没有更新head的值,所以这种情况应该单独提出来写吧?而且你好像也没有考虑没找到appointed item的这种情况。对么?
3 楼 durong11 2014-05-05  
一种解释是:如果是从头结点insert 直接使用addFromHead()方法;

最后那句没明白。

老肥猴_vi 写道
谢谢。但是貌似insert函数( public boolean insert(T appointedItem, T item) )有点问题呢, 如果appointedItem就是head,那么你写的的函数并没有更新head的值,所以这种情况应该单独提出来写吧?而且你好像也没有考虑没找到appointed item的这种情况。对么?

2 楼 老肥猴_vi 2013-10-13  
谢谢。但是貌似insert函数( public boolean insert(T appointedItem, T item) )有点问题呢, 如果appointedItem就是head,那么你写的的函数并没有更新head的值,所以这种情况应该单独提出来写吧?而且你好像也没有考虑没找到appointed item的这种情况。对么?
1 楼 scorpiomiracle 2010-05-06  
不错,不错

相关推荐

    java单链表的基本操作 单链表练习题.zip

    在这个"java单链表的基本操作 单链表练习题.zip"压缩包中,我们可以预见到包含了一个名为"linked-list-master"的项目,它很可能是为了帮助学习者通过实践来理解和掌握单链表的各种操作。下面,我们将深入探讨单链表...

    Java算法实例-单链表操作

    在这个"Java算法实例-单链表操作"中,我们将探讨如何在Java中实现单链表,包括其基本操作如插入、删除、遍历等。这些操作对于理解和解决各种算法问题至关重要,尤其对于学习和准备编程考试的学员来说,是非常实用的...

    Java实现单链表的基本操作

    本文将深入探讨如何使用Java语言实现单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等关键功能。 首先,我们需要理解单链表的概念。单链表是一种线性数据结构,其中每个元素(称为节点)包含两个...

    数据结构单链表的详细设计分析(Java 版本的)

    为了进一步学习,你可以通过`MLDN魔乐JAVA_14链表深入`这个压缩包文件中的示例代码和练习来加深对单链表的理解。这将帮助你实践这些概念,并可能涉及更高级的话题,如迭代器、反向遍历链表以及链表的合并等。

    单链表的一个简单练习

    ### 单链表的一个简单练习 #### 背景与目的 本练习旨在通过实际操作加深对单链表的理解,并掌握如何在单链表中进行数据的存储与查询。题目要求实现的功能包括: 1. 给定一个城市名,能够返回该城市的位置坐标。 2. ...

    Java单链表源码分析-interviews:采访

    Java单链表源码分析采访 您的软件工程技术面试个人指南。 维护者 - 翻译 目录 文章 在线评委 实时编码练习 数据结构 链表 链表是数据元素的线性集合,称为节点,每个元素通过指针指向下一个节点。 它是由一组节点...

    java实现自己的单链表、双链表、Map存储

    在Java编程中,数据结构是基础且至关重要的概念,它们为高效地组织和操作数据提供了结构。本主题将深入探讨如何使用Java实现自己的...这些自定义实现也可以作为学习和练习的基础,帮助我们进一步提升Java编程技能。

    基于Java实现的单链表基本操作之链表反转.zip

    在这个基于Java实现的单链表基本操作中,我们将重点关注链表反转这一特定操作。 链表反转是编程面试中常见的问题,它要求我们改变链表中节点的顺序,使得原链表的最后一个节点成为新链表的第一个节点,原链表的第一...

    java经典算法练习题

    本压缩包包含了三个文档,分别是“JAVA经典算法40题.doc”、“最新JAVA编程题全集_50题及答案.doc”和“50道JAVA基础编程练习题.doc”,这些资源为初学者提供了大量的实践机会,有助于深入理解和运用Java。...

    Java单链表源码分析-interviews-kdn251:采访-kdn251

    Java单链表源码分析采访 您的软件工程技术面试个人指南。 维护者 - 翻译 目录 在线评委 实时编码练习 数据结构 链表 链表是数据元素的线性集合,称为节点,每个元素通过指针指向下一个节点。 它是由一组节点组成的...

    java 数据结构练习示例.zip

    本资源包"java 数据结构练习示例.zip"包含了针对C/C++/JAVA/Python四种编程语言的数据结构学习资料,特别强调了Java的相关知识,对于大学生或初学者来说是一份宝贵的参考资料。 首先,让我们深入了解一下Java中的...

    单链表操作验证

    单链表是一种基础且重要的数据结构,用于存储和组织数据。在计算机科学中,它由一系列节点组成...通过这样的练习,学生可以深入理解单链表的工作原理,提升编程技巧,并掌握如何有效地验证和测试数据结构操作的正确性。

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】

    这份资源包含的"JAVA基础编程练习题50题及经典算法90题"是学习和提升Java技能的理想材料。以下将分别介绍这些题目可能涵盖的知识点。 一、Java基础编程练习题50题: 这50题主要针对Java语法、数据类型、控制结构、...

    数据结构-单链表的操作

    在C++或Java中,这可以通过定义一个头指针并将其设置为null来实现。在Python中,可以创建一个空的列表作为链表的表示。 **2. 插入节点** 在单链表中插入节点包括定位插入位置(如果指定位置)和更新指针。插入操作...

    java算法 面试练习

    "java算法 面试练习"这个主题涵盖了大约100多个算法题目和对应的解答,旨在帮助初学者深入学习和实践。 一、基础算法 1. 排序算法:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,这些都是面试...

    数据结构中的单链表的基本操作

    通过实际编程练习这些操作,可以更好地掌握单链表的原理和应用。在实际编程中,还需要注意处理边界条件,如空链表或找不到要操作的节点等。单链表在解决许多实际问题中都有应用,例如缓存管理、队列实现和图形遍历等...

Global site tag (gtag.js) - Google Analytics