ในบทความนี้ เราจำเป็นต้องย้อนกลับลิงก์โดยใช้รายการที่เชื่อมโยงเพียงอย่างเดียว งานของเราคือสร้างฟังก์ชันที่สามารถย้อนกลับรายการเชื่อมโยงที่กำหนดโดยลำพังได้ ตัวอย่างเช่น
Input: Following Linked list : 1->2->3->4->NULL Output: After processing of our function: 4->3->2->1->NULL
แนวทางในการหาทางออก
มีหลายวิธีในการย้อนกลับรายการที่เชื่อมโยง โดยทั่วไปแล้ว วิธีง่ายๆ ที่อยู่ในใจของเราคือการย้อนดูรายการและย้อนกลับในขณะที่ดำเนินการผ่าน
แนวทางง่ายๆ
เราจะตรวจสอบรายการที่เชื่อมโยงในแนวทางนี้และพยายามย้อนกลับในขณะที่ดำเนินการต่อไป
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
Node(int data) {
this->data = data;
next = NULL;
}
};
struct LinkedList {
Node* head;
LinkedList() { head = NULL; }
// Function to print linked list
void reverse() {
auto curr = head; // current pointer
Node* prev = NULL; // previous pointer
while(curr) {
auto temp = curr -> next;
curr -> next = prev;
prev = curr;
head = prev;
curr = temp;
}
}
void print() {
struct Node* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
void push(int data) {
Node* temp = new Node(data);
temp->next = head;
head = temp;
}
};
int main() {
LinkedList list;
list.push(20);
list.push(4);
list.push(15);
list.push(85);
list.print();
list.reverse();
cout << "\n";
list.print();
} ผลลัพธ์
85 15 4 20 20 4 15 85
ในแนวทางนี้ เราเพียงแค่สำรวจรายการและย้อนกลับเมื่อเราดำเนินการผ่านรายการนั้น เป็นแนวทางที่ดีเนื่องจากความซับซ้อนของเวลาคือ O(N) โดยที่ N คือขนาดของรายการของเรา
ตอนนี้เราลองทำการทดลองหนึ่งที่เราพยายามใช้สแต็กเพื่อย้อนกลับรายการ
แนวทางกับ Stack
เราจะใช้สแต็กเพื่อเก็บโหนดทั้งหมดในโปรแกรมนี้และย้อนกลับโดยไปที่สแต็ก
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
Node(int data) {
this->data = data;
next = NULL;
}
};
struct LinkedList {
Node* head;
LinkedList() { head = NULL; }
// Function to print linked list
void reverse() {
auto curr = head; // current pointer
Node* prev = NULL; // previous pointer
stack<Node *> s;
while(curr) {
s.push(curr);
curr = curr -> next;
}
prev = s.top();
head = prev;
s.pop();
while(!s.empty()) {
auto temp = s.top();
s.pop();
prev -> next = temp;
prev = temp;
}
prev -> next = NULL;
}
void print() {
struct Node* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
void push(int data) {
Node* temp = new Node(data);
temp->next = head;
head = temp;
}
};
int main() {
LinkedList list;
list.push(20);
list.push(4);
list.push(15);
list.push(85);
list.print();
list.reverse();
cout << "\n";
list.print();
}
ผลลัพธ์
85 15 4 20 20 4 15 85
คำอธิบายของโค้ดด้านบน
ในแนวทางนี้ เราจัดเก็บโหนดรายการในสแต็กในขณะที่กำลังดำเนินการ จากนั้นใช้สแต็กเพื่อป๊อปอัปและย้อนกลับรายการ วิธีการนี้ยังมีความซับซ้อนด้านเวลาของ O(N) โดยที่ N คือขนาดรายการของเรา ก่อนหน้านี้ เราใช้ stack ดังนั้นเราจึงสามารถใช้วิธีการแบบเรียกซ้ำได้เช่นเดียวกับที่ใช้สแต็ก ดังนั้นตอนนี้เราจะสร้างวิธีการแบบเรียกซ้ำ
แนวทางแบบเรียกซ้ำ
ในแนวทางนี้ เราจะทำขั้นตอนเดียวกันกับก่อนหน้านี้แต่มีการเรียกซ้ำ
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
Node(int data) {
this->data = data;
next = NULL;
}
};
struct LinkedList {
Node* head;
LinkedList() { head = NULL; }
// Function to print linked list
void rreverse(Node *curr, Node *prev) {
if(curr == NULL) {
// prev -> next = curr;
head = prev;
return;
}
rreverse(curr -> next, curr);
curr -> next = prev;
prev -> next = NULL;
}
void reverse() {
auto curr = head; // current pointer
Node* prev = NULL; // previous pointer
rreverse(curr -> next, curr);
}
void print() {
struct Node* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
void push(int data) {
Node* temp = new Node(data);
temp->next = head;
head = temp;
}
};
int main() {
LinkedList list;
list.push(20);
list.push(4);
list.push(15);
list.push(85);
list.print();
list.reverse();
cout << "\n";
list.print();
} ผลลัพธ์
85 15 4 20 20 4 15 85
ในแนวทางนี้ เราทำแบบเดียวกันกับก่อนหน้านี้ แต่มีการโทรแบบเรียกซ้ำ ดังนั้นวิธีการนี้จึงมีความซับซ้อนด้านเวลาของ O(N) โดยที่ N คือขนาดของรายการของเรา
บทสรุป
ในบทความนี้ เราจะแก้ปัญหาการกลับรายการที่มีลิงก์อย่างเดียว นอกจากนี้เรายังได้เรียนรู้โปรแกรม C ++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ (ปกติและอีกสองวิธี) โดยที่เราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์