在 Java 中创建通用链表
本文我们将介绍如何在 Java 中创建一个通用的单链表。
Java LinkedList 简介
LinkedList 是线性数据结构,它将数据存储在随机地址的节点中,并且意味着位于不连续的位置。
每个节点都有两部分:数据和引用(地址)。 Data/value字段存储值,reference字段存储链表的下一个节点的地址。
将作为成员函数实现的该数据结构的一些常见操作如下。
- addNode() - 此方法用于在 LinkedList 末尾添加新元素。
- removeNode(value) - 此方法删除具有指定值的节点。
- addNode(position,value) - 此方法用于在特定位置添加值。
- clear() - 此方法清除整个 LinkedList。
- isEmpty() - 此方法用于检查 LinkedList 是否为空。
- length() - 此方法为我们提供 LinkedList 的长度。
Java中单链表的通用实现
普通的LinkedList只能存储一种类型的值:整型、字符串、布尔型、浮点型等,所以我们在创建的时候就必须指定类型,但是如果我们要创建一个可以存储任意类型数据的LinkedList怎么办? 数据类型; 为此,我们将使用 Java 中的泛型概念。
创建通用节点类:
在下面的代码中,T表示LinkedList上存储的数据类型。
class Node<T>
{
T value;
Node<T> nextPtr;
Node(T value)
{
this.value = value;
this.nextPtr = null;
}
}
现在让我们创建通用 LinkedList 类创建方法。
-
add()
函数:void add(T value) { Node<T> temp = new Node<>(value); //creating a new node if(this.head == null) //checking if the list is empty head = temp; else //if the list is not empty, we go till the end and add the node { Node<T> tr = head; while(tr.nextPtr!=null){ tr = tr.nextPtr; } tr.nextPtr = temp; } length = length + 1; //increasing the length of list }
-
remove()
函数:void remove(T key) { Node<T> prev = new Node<>(null); prev.nextPtr = head; Node<T> next = head.nextPtr; Node<T> tr = head; boolean isNodepresent = false; // to check if node is present if(head.value == key ){ head = head.nextPtr; isNodepresent =true; } while(tr.nextPtr!=null) { if(String.valueOf(tr.value).equals(String.valueOf(key))){ //if the node is present, we break the loop prev.nextPtr = next; //we assign previous node's nextPtr to next node isNodepresent = true; break; } prev = tr; //updating the previous and next pointers tr = tr.nextPtr; next = tr.nextPtr; } if(isNodepresent==false && String.valueOf(tr.value).equals(String.valueOf(key))){ prev.nextPtr = null; isNodepresent = true; } if(isNodepresent) { length--; //if the node is present, we reduce the length } else { System.out.println("The value is not present inside the LinkedList"); } }
-
add(position,value)
函数:void add(int position,T value) { if(position>length+1) //if the position entered is more than the list length { System.out.println("Position out of bound"); return; } if(position==1){ //if the position is one we'll just Node<T> temp = head; head = new Node<T>(value); head.nextPtr = temp; return; } Node<T> tr = head; Node<T> prev = new Node<T>(null); //creating a new node prev while(position-1>0) //we find the position in the list { prev = tr; tr = tr.nextPtr; position--; } prev.nextPtr = new Node<T>(value); //update the next pointer of previous node prev.nextPtr.nextPtr = tr; }
-
getLength()
函数:int getLength() { return this.length; //returns the length of the list }
-
isEmpty()
函数:boolean isEmpty() { if(head == null) //if the list is empty we return true return true; else return false; }
-
clear()
函数:void clear() { head = null; //make head as null and length as zero length = 0; }
-
toString()
函数: 在下面的代码中,我们添加并重写了 toString 方法来打印 LinkedList 的内容。@Override public String toString() { Node<T> temp = head; String str = "{ "; if(temp == null) //if the list is empty { System.out.println( "list is empty"); } while(temp.nextPtr!=null) //we keep appending data to string till the list is empty { str += String.valueOf(temp.value) +"->"; temp = temp.nextPtr; } str += String.valueOf(temp.value); return str+"}"; //we finally return the string }
带有主类的完整工作代码:
class Node<T>
{
T value;
Node<T> nextPtr;
Node(T value)
{
this.value = value;
this.nextPtr = null;
}
}
class LinkedList<T>
{
Node<T> head;
private int length = 0;
LinkedList()
{
this.head = null;
}
void add(T value)
{
Node<T> temp = new Node<>(value);
if(this.head == null)
head = temp;
else
{
Node<T> tr = head;
while(tr.nextPtr!=null){
tr = tr.nextPtr;
}
tr.nextPtr = temp;
}
length = length + 1;
}
void remove(T key)
{
Node<T> prev = new Node<>(null);
prev.nextPtr = head;
Node<T> next = head.nextPtr;
Node<T> tr = head;
boolean isNodepresent = false;
if(head.value == key ){
head = head.nextPtr;
isNodepresent =true;
}
while(tr.nextPtr!=null)
{
if(String.valueOf(tr.value).equals(String.valueOf(key))){
prev.nextPtr = next;
isNodepresent = true;
break;
}
prev = tr;
tr = tr.nextPtr;
next = tr.nextPtr;
}
if(isNodepresent==false && String.valueOf(tr.value).equals(String.valueOf(key))){
prev.nextPtr = null;
isNodepresent = true;
}
if(isNodepresent)
{
length--;
}
else
{
System.out.println("The value is not present inside the LinkedList");
}
}
void add(int position,T value)
{
if(position>length+1)
{
System.out.println("Position out of bound");
return;
}
if(position==1){
Node<T> temp = head;
head = new Node<T>(value);
head.nextPtr = temp;
return;
}
Node<T> tr = head;
Node<T> prev = new Node<T>(null);
while(position-1>0)
{
prev = tr;
tr = tr.nextPtr;
position--;
}
prev.nextPtr = new Node<T>(value);
prev.nextPtr.nextPtr = tr;
}
int getLength()
{
return this.length;
}
boolean isEmpty()
{
if(head == null)
return true;
else
return false;
}
void clear()
{
head = null;
length = 0;
}
@Override
public String toString()
{
Node<T> temp = head;
String str = "{ ";
if(temp == null)
{
System.out.println( "list is empty");
}
while(temp.nextPtr!=null)
{
str += String.valueOf(temp.value) +"->";
temp = temp.nextPtr;
}
str += String.valueOf(temp.value);
return str+"}";
}
}
public class Example
{
public static void main(String[] args) {
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);
ll.remove(3);
System.out.println(ll);
ll.add(2,800);
System.out.println(ll);
}
}
输出:
{ 1->2->3}
{ 1->2}
{ 1->800->2}
相关文章
在JavaFX中使用setAlignment方法
发布时间:2023/08/09 浏览次数:129 分类:Java
-
在本文中,我们将了解如何以我们自己的格式对齐 HBox。 我们将看一个例子并逐行解释它以使其更容易理解。在 JavaFX 中使用 setAlignment() 方法
在 JavaFX 中使用 KeyEvent
发布时间:2023/08/09 浏览次数:70 分类:Java
-
KeyEvent 用于检测按键并在按下按键时执行特定的代码块。本文将展示如何创建按键事件并在用户按下按键时执行简单的代码。 我们还将看到一个简单的示例,以使其更容易理解。
在 JavaFX 中移动对象
发布时间:2023/08/09 浏览次数:199 分类:Java
-
在本文中,我们将向左、右、上、下四个方向移动对象。 为此,我们将使用以下代码。在 JavaFX 中移动对象 我们看一下下面的代码。 我们稍后会解释。
修复在 JRE 8 中使用 JavaFX 时的访问限制错误
发布时间:2023/08/09 浏览次数:95 分类:Java
-
本文将讨论如何修复在 JRE 8 中使用 JavaFX 时出现的访问限制错误。此错误主要发生在 Eclipse IDE 中; 我们的解决方案主要基于Eclipse。修复在 JRE 8 中使用 JavaFX 时的访问限制错误
JavaFX 中的 setOnAction 方法
发布时间:2023/08/09 浏览次数:168 分类:Java
-
在本文中,我们将了解如何为任何 UI 组件创建操作。 此外,我们将看到一个带有解释的示例,以使该主题更容易理解。在JavaFX中使用setOnAction方法
JavaFX 中的 setCellValueFactory 方法
发布时间:2023/08/09 浏览次数:138 分类:Java
-
在本文中,我们将讨论此方法并查看一个带有解释的示例。在 JavaFX 中使用 setCellValueFactory 方法 在下面的示例中,我们创建了一个包含一些数据的简单表。 我们示例的代码如下所示。
在 JavaFX 中创建透明场景
发布时间:2023/08/09 浏览次数:154 分类:Java
-
本文将展示如何在我们的应用程序上创建这个场景。 此外,我们还看到一个带有适当解释的示例,以使该主题更容易理解。在 JavaFX 中创建透明场景 在下面的示例中,我们将制作一个完全不可
清除 JavaFX 中的画布
发布时间:2023/08/09 浏览次数:95 分类:Java
-
在本文中,我们将了解如何删除或清除画布。 我们还通过必要的代码和解释来讨论这个主题,以使其更容易理解。清除 JavaFX 中的画布 名为 clearRect() 的方法允许我们删除特定组件或清除画布。
使用 JavaFX 播放视频
发布时间:2023/08/09 浏览次数:200 分类:Java
-
使用 JavaFX 播放视频有一些先决条件。应安装 JavaFX。 应安装 SceneBuilder。 使用 JavaFX 播放视频