Skip to content

Instantly share code, notes, and snippets.

@thinkphp
Created May 23, 2026 08:09
Show Gist options
  • Select an option

  • Save thinkphp/ecb4f9673934f43993d83f930c583cc9 to your computer and use it in GitHub Desktop.

Select an option

Save thinkphp/ecb4f9673934f43993d83f930c583cc9 to your computer and use it in GitHub Desktop.
Doubly-Linked-List (creare, adaugare dupa si inainte, stergere, afisare si reverse)
#include <iostream>
class DoublyLinkedList {
struct Node {
int data;
struct Node *next;
struct Node *prev;
Node(int d): data(d), next(nullptr), prev(nullptr){}
};
struct Node *head = nullptr;
public:
//4--->>3--->2 -->1
//push_front()
//push_back()
void addToLinkedList(int val) {
Node *newNode = new Node( val );
if( head == nullptr ) {
head = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}
//HEAD -> 1 2 3 4 X 5 6 7 8
// c
void addAfterNode(int afterNode, int val) {
Node *c = head;
//ne pozitionam pe nodul dupa care vreau sa inserez noul NODE
while(c != nullptr && c->data != afterNode) c = c->next;
if(c == nullptr) {
std::cout<<"Nodul cu informatie afternode nu exista in lista";
return;
}
//am creat nodul nou
// next(nullptr)
// prev(nullptr)
Node *newNode = new Node( val );
newNode->next = c->next;
newNode->prev = c;
if(c->next != nullptr) {
c->next->prev = newNode;
}
c->next = newNode;
}
//1 --> 2 --> 3 --> ,,,,, --->N
//next
void display() {
Node*c = head;
while(c != nullptr) {
std::cout<<c->data<<" ";
if(c->next != nullptr) std::cout<< " <-> ";
c = c->next;
}
std::cout<<std::endl;
}
//1 --> 2 --> 3 --> ,,,,, --->N
//1 <--> 2 <--> 3 <--> ,,,,, <--->N
void displayReverse() {
Node *c = head;
if(c == nullptr) {
return;
}
while(c->next != nullptr) {
c = c->next; // ma duc pana la capat
}
while(c !=nullptr) {
std::cout<<c->data<<" ";
if(c->prev != nullptr) std::cout<<" <-->";
c = c ->prev;//ma deplasez pe prev
}
}
/*
1 2 3 X 4 5 6 7
newNode
*/
void addBeforeNode(int beforeNode, int val) {
Node*newNode = new Node( val );
if(head != nullptr && head->data == beforeNode) {
newNode->next = head;
head->prev = newNode;
head = newNode;
return;
}
Node *c = head;
while(c != nullptr && c->next != nullptr && c->next->data != beforeNode) {
c = c->next;
}
if( c == nullptr || c->next == nullptr) {
std::cout<<"Nodul nu a fost gasit!"<<std::endl;
return;
}
//1 2 3 4 5 X 22 6 7 8
// c
newNode->next = c->next;
newNode->prev = c;
if(c->next != nullptr) {
c->next->prev = newNode;
}
c->next = newNode; //(X)
}
// 1 2 3 4 5 6 7
// head
void removeNode(int delNode) {
if(head ==nullptr) {
std::cout<<"Lista este Goala";
return;
}
//cazul in care nodul de sters este chiar HEAD
if(head->data == delNode) {
Node *toRemove = head;//luam adresa capului listei
head = head->next;
if(head != nullptr) {
head->prev = nullptr;
}
delete toRemove;
return;
}
//1 2 3 4 5 toRemove 6 7 8 9
// c
/*
step 1: te pozitionezi pe nodul de dinaintea nodului de sters =>C
*/
Node *c = head;
while(c->next != nullptr && c->next->data != delNode) {
c = c->next;
}
//testam daca exista in lista
if(c->next == nullptr) {
std::cout<<"Nodul cu valoare delNode nu exista in Doubly Linked List";
return;
}
//daca exista nodul de sters
Node *nodeToRemove = c->next; //retinem adresa nodului de sters
//c->next = adresa nodului de STERS
c->next = nodeToRemove->next;
if(nodeToRemove->next != nullptr) {
nodeToRemove->next->prev = c;
}
delete nodeToRemove;//stergi nodul din memoria HEAP
}
};
int main(int argc, char const *argv[])
{
DoublyLinkedList list;
int arr[] = {1, 22, 3, 4, 57, 10 , 101};
for(int val: arr) {
list.addToLinkedList(val);
}
list.display();
//std::cout<<"REVERSE Cu deplasare pe PREV:\n";
//list.displayReverse();
std::cout<<"Adaugare dupa Node:\n";
list.addAfterNode(57,58);
list.display();
std::cout<<"Adaugare inainte Node:\n";
list.addBeforeNode(57,56);
list.display();
std::cout<<"Stergere Node HEAD:\n";
list.removeNode(101);
list.display();
std::cout<<"Stergere Node din interiorul Listei:\n";
list.removeNode(4);
list.display();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment