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
}
}
分享到:
相关推荐
以上就是使用Java实现单链表及其实现的各种操作的详细解析。掌握这些基本操作,能帮助我们在处理复杂问题时更加得心应手。在实际编程中,根据具体需求,还可以扩展链表的功能,例如支持双向链表、循环链表等。
单链表分段逆转 java 实现单链表逆转详解及实例代码
本文将深入探讨如何使用Java语言实现单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等关键功能。 首先,我们需要理解单链表的概念。单链表是一种线性数据结构,其中每个元素(称为节点)包含两个...
java单链表
这些基本操作展示了如何使用Java实现单链表的主要功能。在实际应用中,可能还需要实现其他功能,如反转链表、查找元素、合并两个排序的链表等。通过熟练掌握单链表的实现,可以为理解和操作更复杂的数据结构打下坚实...
本文将详细介绍如何使用Java实现单链表的逆序。 首先,我们需要定义一个单链表的节点类`Node`,它包含两个属性:`data`用于存储数据,`next`用于指向下一个节点。如以下代码所示: ```java class Node { int data...
以上是Java实现单链表基本操作的详细步骤。通过理解这些基础知识,你可以轻松地扩展链表的功能,实现更复杂的算法和数据结构操作。在实际编程中,了解并熟练掌握这些概念对于提高代码效率和解决实际问题至关重要。
这个项目提供了Java实现单链表基本操作,包括链表排序的具体代码,可以帮助初学者深入理解链表数据结构及其操作。通过实践这些操作,可以提升对数据结构的理解,为更复杂的算法和系统设计打下坚实的基础。
以上就是使用Java实现单链表的基本操作。`Java单链表的操作代码int型.rar`和`Java单链表的操作代码char型.rar`两个压缩包中可能包含了这些类的源代码示例,供学习者参考和实践。通过这些代码,你可以了解如何在实际...
package 数据结构算法.链表; /* *定义节点 * 链表由节点构成 */ public class Node<E> { private E e; //数据data private Node<E> next; //指向下一个节点 public Node() { } public Node(E e) { ...
在Java编程中,单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个值和一个指向下一个节点的引用。单链表的翻转是数据结构与算法中的一个经典问题,通常有两种主要的实现方式:递归和非递归。本篇...
昨天到笔试,没想到出了这么一个题,用java实现单链表,并把它逆序,输出,我晕了半天,回来才做出来,不知道还有没有用?!
本篇将深入探讨如何使用Java实现单链表,并特别关注链表相交的检测方法。 首先,我们需要创建一个链表节点类(Node)来存储数据和引用下一个节点: ```java public class Node { int data; Node next; public ...
总结来说,Java实现单链表涉及创建节点类,定义链表类以及实现链表的基本操作,如插入、删除和遍历。掌握这些基础知识对于提升Java程序员的数据结构技能是至关重要的,因为它们是构建复杂数据结构和算法的基石。通过...
在本实验中,我们将实现一个基于JAVA的单链表操作实验,该实验可以实现以下三个功能:1.根据从键盘输入一串字符串自动生成一个单链表;2.根据指定元素删除相应的结点,可以一次性删除多个结点;3.根据指定修改相应...