Introduction
Nothing to say more than hello 👋,
In Case your wondering who is this man in the banner it's the Khwarizmi the inventor of algorithms concept.
Make sure to follow because I will start more advanced series in future.
Linked List
Single Linked List
struct node { char data; struct node *next; }
self reference structures we talk about them before.
first element is called head.
arrays are dynamic access , while linked lists are sequential accessible , it mean you need to visit all the previous element in order to reach the element you need , it mean O(n)
while arrays are O(1)
searching in both will take O(n)
.
struct node *p; p = head->next->next; // 30 p->next->next->next=p; // 50 will link to 30 , so 60 is lost head->next=p->next; // 10 will link to 40 printf("%c" , head->next->next->next->next->data); // d
This linked list is same for all the followings. We are assuming that our linked list have more than 1 node , if it is 1 node we should put conditions to make sure that if our linked list can perform certain things.
Traversing a single linked list
struct node *t; t = head; while(t != NULL) { // or while(t) have same meaning printf("%d\n" , t->data); t=t->next; }
we are using t
because if we lost the head , it's mean we lost the entire node.
Inserting an element in single linked list
struct node* new = (struct node*)malloc(sizeof(struct node))
this is will create a pointer called new
a) insert at beginning :
new->next=head; head = new;
b) insert at the end
while(t->next != NULL) { t=t->next; } t->next = new; new->next = NULL;
c) insert a node at specific element
struct node { int i; struct node *next; } // asume we need to insert after node 2 while(t->i != 2) { t = t->next; } new->next = t->next; t->next = new;
Deleting a node from single linked list
malloc
will create a space for us while free
will free the memory that we got it from malloc
// assume we are resetting the linked list to it's init state // deleting a node from the head head = head->next; free(t); // deleting a node from the tail while(t->next->next != NULL) { t = t->next; } free(t->next); t->next=NULL; // delete a specific node while(t->next->i != 3){ t = t->next; } struct node *t1 = t->next; t->next = t1->next; // or t->next->next free(t1);
example 1
struct node { int val; struct node *next; }; void rearrange(struct node *list) { struct node *p , *q; int temp; if(!list || !list->next) return; // if linkedlist have no or 1 element return p = list; q=list->next; // q pointing to 1st element and q to second while(q) // while q is not null do { temp = p->val;p->val=q->val; q->val=temp;p=q->next; // swap q and p q=p?p->next:0; // if p is pointing to something it will take it otherwise 0 } } // output : 2 1 4 3 6 5 7
printing the elements using recursion
// print then recursion void f(struct node *p) { if(p)//1 {//2 printf("%d" , p->data);//3 f(p->link);//4 }//5 } // output : 1 2 3 4
It will print before start go into next stack
when it's go back it will return to line 5
// recursion then print === print in reverse order void f(struct node *p) { if(p)//1 {//2 f(p->link);//3 printf("$d" , p->data);//4 }//5 } // output : 4 3 2 1
then when it go back it will start at line 4 which printing the value of p stored inside of each stack
Reversing an single linked list using iteration
struct node { int i; struct node * next; } struct node * reverse(struct node * cur) { struct node *prev = NULL,*nextNode = NULL; while(cur) { nextNode = cur->next; cur->next=prev; prev=cur; cur=nextNode; } return prev; }
Reversing an single linked list using recursion
struct node *head; void reverse(struct node *prev , struct node *cur) { if(cur) { reverse(cur , cur->next); cur->next = prev; } else head = prev; } void main() { //... reverse(NULL , head); //.. }
circular Linked List
circular linked list have it's tail pointing to sentinel which is the head but containing the number of nodes instead with pointer to first element.
while(p->next != head){}
double linked list
// insert at start struct node { int i; struct node *prev; struct node *next; }; t->next = head; head = t; t->prev = NULL; head->next->prev = head; // insert at the end while(p->next) p = p->next; p->next=t; t->prev=p; t->next=NULL; // insert between > 1 and < n where n is number of node t->prev=p; // p is the pointer of the element previous to t t->next=p->next; p->next=t; t->next->prev=t;
Top comments (0)