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