Java程序在不操作指针的情况下反转链表
Java中的链表和指针
链表是Java环境中的线性数据结构,用于以相邻的方式存储元素。链表包含一些地址和指针,这些地址和指针用于在列表中存在的元素之间创建链接。链表中存在两种类型的元素。它们是 - 数据元素和地址元素。数据部分指示元素的值,而地址部分有助于在元素(也称为节点)之间创建链接。
在Java中,还有另一个指针的概念。指针是内存中某些特定位置的地址。它们作为对对象的引用发挥着重要作用。在本文中,我们将学习如何使用Java方法在不操作其指针的情况下反转链表。
在链表的反转操作中,不会对链接进行任何操作。它将链表的节点连接到前一个节点。
对于链表,有三个指针 - 当前、前一个和下一个。这些用于使用递归方法到达链表的最后一个节点。
实现结果的过程 -
列表划分 - 第一个节点和链表。
调用反转
将第一个节点与其余节点链接。
头指针为NULL。
反转链表的算法
以下是使用Java反转链表的一般算法 -
步骤1 - 类初始化。
步骤2 - 将头和尾都声明为null。
步骤3 - 分配一个函数来查找链表的大小。
步骤4 - 检查链表是否为空。
步骤5 - 打印数据。
步骤6 - 声明 temp = temp.next。
步骤7 - Print(end)
步骤8 - 在开头添加一个节点。
步骤9 - 声明一个指向头的临时节点。
步骤10 - 查找链表是否为空。
步骤11 - 如果不是,则设置指向临时节点的头。
步骤12 - 在任何索引处添加一个节点。
步骤13 - 抛出一个新的异常。
步骤14 - 返回Temp。
步骤15 - int left =0, int right = this.size。
步骤16 - 交换左节点和右节点的数据。
步骤17 - 数据反转。
语法
后跟反转链表。
While (current!=NULL){
next= current->next;
current->next=prev;
prev=current;
}
*head_ref=prev;
要反转链表,需要遵循两个最重要的步骤;
声明NULL指针、头指针和下一个指针(其中prev和next都为NULL)。
遍历链表中的循环。
以下方法可用于在没有指针的情况下反转链表 -
方法1 − 通过更改数据值进行反转
方法2 − 反转链表的迭代方法
通过更改数据值进行反转
在不操作任何指针的情况下,有一种反转链表的方法。它是通过更改数据的值。这意味着,在节点中输入新数据以保存并将其用于进一步操作。
示例
class LinkedList{
Node head;
class Node{
int data;
Node next;
Node (int x){
data = x;
next = null;
}
}
public void display (){
Node temp = head;
while (temp != null){
System.out.print (temp.data + " ");
temp = temp.next;
}
System.out.println ("END");
}
public Node insertBeginning (int data){
Node newNode = new Node (data);
newNode.next = head;
head = newNode;
return head;
}
public void reverse (){
Node pointer = head;
Node previous = null, current = null;
while (pointer != null){
current = pointer;
pointer = pointer.next;
current.next = previous;
previous = current;
head = current;
}
}
}
public class Main{
public static void main (String[]args){
try{
LinkedList ll0 = new LinkedList ();
ll0.insertBeginning (2);
ll0.insertBeginning (4);
ll0.insertBeginning (6);
ll0.insertBeginning (8);
System.out.println("LinkedList before reversal : ");
ll0.display ();
System.out.println("LinkedList after reversal : ");
ll0.reverse ();
ll0.display ();
}
catch (Exception e){
System.out.println ("Exception occurred.");
}
}
}
输出
LinkedList before reversal : 8 6 4 2 END LinkedList after reversal : 2 4 6 8 END
反转链表的迭代方法
迭代方法是另一种众所周知的方法来反转链表。此方法在以下程序中使用。
示例
public class LinkedListIterative {
static LinkedListNode head;
static class LinkedListNode {
int val;
LinkedListNode next;
LinkedListNode(int no){
val = no;
next = null;
}
}
LinkedListNode reverse(LinkedListNode node){
LinkedListNode previous = null;
LinkedListNode curr = node;
LinkedListNode next = null;
while (curr != null){
next = curr.next;
curr.next = previous;
previous = curr;
curr = next;
}
node = previous;
return node;
}
void printList(LinkedListNode nde){
while (nde != null){
System.out.print(nde.val + " ");
nde = nde.next;
}
}
public static void main(String argvs[]){
LinkedListIterative listObj = new LinkedListIterative();
listObj.head = new LinkedListNode(4);
listObj.head.next = new LinkedListNode(6);
listObj.head.next.next = new LinkedListNode(7);
listObj.head.next.next.next = new LinkedListNode(1);
listObj.head.next.next.next.next = new LinkedListNode(5);
listObj.head.next.next.next.next.next = new LinkedListNode(8);
listObj.head.next.next.next.next.next.next = new LinkedListNode(3);
listObj.head.next.next.next.next.next.next.next = new LinkedListNode(2);
System.out.println("The Linked list before reversal is: ");
listObj.printList(head);
head = listObj.reverse(head);
System.out.println("\n");
System.out.println("After reversal, the linked list is: ");
listObj.printList(head);
}
}
输出
The Linked list before reversal is: 4 6 7 1 5 8 3 2 After reversal, the linked list is: 2 3 8 5 1 7 6 4
结论
从以上讨论中,我们学习了如何更改链表的数据。同样,我们构建了一个Java代码,使用列表中名为left和right的两个指针工作。
因此,已经看到编写的代码和算法如何帮助您获得对所述方法的更广泛的了解。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP