• Skip to primary navigation
  • Skip to content
  • Skip to primary sidebar
  • Skip to secondary sidebar

GoHired

Interview Questions asked in Google, Microsoft, Amazon

Join WeekEnd Online Batch from 4-April-2020 on How to Crack Coding Interview in Just 10 Weeks : Fees just 20,000 INR

  • Home
  • Best Java Books
  • Algorithm
  • Internship
  • Certificates
  • About Us
  • Contact Us
  • Privacy Policy
  • Array
  • Stack
  • Queue
  • LinkedList
  • DP
  • Strings
  • Tree
  • Mathametical
  • Puzzles
  • Graph

Memory Efficient LinkedList

August 24, 2014 by Dhaval Dave

Memory efficient linked list is also called XOR Linked List.
To use lesser memory in doubly link list, such data structure is used.

An ordinary doubly linked list stores addresses of the previous and next list items in each list node, requiring two address fields:

...  A       B         C         D         E  ...
–> next –> next –> next –>
<– prev <– prev <– prev <–

An XOR linked list compresses the same information into one address field by storing the bitwise XOR (here denoted by ⊕) of the address for previous and the address for next in one field:

...  A        B         C         D         E  ...
<–> A⊕C <-> B⊕D <-> C⊕E <->


We can traverse the XOR list in both forward and reverse direction. While traversing the list we need to remember the address of the previously accessed node in order to calculate the next node’s address

For example:
When we are at node C, we must have address of B stored in some extra variable.
XOR of ADD(B) and XAdd of C gives us the ADD(D).

Reason is simple: XAdd(C) is : “ADD(B) XOR ADD(D)”.
If we do xor of XAdd(C) with ADD(B), we get the result as
“ADD(B) XOR ADD(D) XOR ADD(B)” = “ADD(D) XOR 0″ = “ADD(D)”.
So we have the address of next node.
Similarly we can traverse the list in backward direction.

#include <stdio.h>
#include <stdlib.h>
#define gc getchar_unlocked
inline int scan(){register int n=0,c=gc();while(c<‘0’||c>’9’)c=gc();while(c<=’9’&&c>=’0′)n=(n<<1)+(n<<3)+c-‘0’,c=gc();return n;} 

typedef struct node
{
    int data;
    struct node* np;  /* XOR of next and previous node */
}node;
node *head, *tail;

struct node* XOR (struct node *a, struct node *b){
    return (struct node*) ((unsigned int) (a) ^ (unsigned int) (b));
}
void insert(int data)
{
    node *new_node = (node*) malloc(sizeof(node));
    new_node->data = data;

    if (NULL == head) {
        new_node->np = NULL;
        head = tail = new_node;
    } 
    //else if (at_tail) {
    else{
        new_node->np = XOR(tail, NULL);
        tail->np = XOR(new_node, XOR(tail->np, NULL));
        tail = new_node;
    } 
    /*else {  //code to enter new node at head 
        new_node->np = XOR(NULL, head);
        head->np = XOR(new_node, XOR(NULL, head->np));
        head = new_node;
    }*/
}


void printList (struct node *head)
{
    struct node *curr = head;
    struct node *prev = NULL;
    struct node *next;
    printf (“Following are the nodes of Linked List: n”);
    while (curr != NULL){
        printf (“%d “, curr->data);        
        next = XOR (prev, curr->np);
        prev = curr;
        curr = next;    
    }    
}

// Driver program to test above functions
int main ()
{
    //struct node *head = (struct node *) malloc (sizeof (struct node) );
    head = NULL;

    
    int t,n;
    t=scan();
    printf(“%dn”,t);
    
    while(t–){
        n=scan();
        insert(n);
    }
    printList (head);

    return (0);
}

See working code at http://ideone.com/YdZmJk
Reference :  http://www.linuxjournal.com/

Similar Articles

Filed Under: problem Tagged With: Linked List

Reader Interactions

Primary Sidebar

Join WeekEnd Online/Offline Batch from 4-April-2020 on How to Crack Coding Interview in Just 10 Weeks : Fees just 20,000 INR

Join WeekEnd Online/Offline Batch from 4-April-2020

WhatsApp us

Secondary Sidebar

Custom Search

  • How I cracked AMAZON
  • LeetCode
  • Adobe
  • Amazon
  • Facebook
  • Microsoft
  • Hacker Earth
  • CSE Interview

Top Rated Questions

Top 10 Interviews Techniqes for Campus Interview in IIT NIT BITS for MTech

Generate largest number arranging a no. of given non negative integer numbers

Flipkart SDET Interview Experience

write a c program that given a set a of n numbers and another number x determines whether or not there exist two elements in s whose sum is exactly x

Right view of Binary tree

Given Set of words or A String find whether chain is possible from these words or not

strtok()

K’th Largest Element in BST when modification to BST is not allowed

‘N’ Story Building, with 1,2,3 steps how many ways can a person reach top of building.

Fibonacci Hashing & Fastest Hashtable

Print Power Set of a Set

Handle duplicates in Binary Search Tree

Given array of 0’s and 1’s. All 0’s are coming first followed by 1’s. find the position of first 1

Find the kth number with prime factors 3, 5 and 7

Printing each word reverse in string

Find an index i such that Arr [i] = i in array of n distinct integers sorted in ascending order.

BlueStone E-commerce Interview Experience

Spanning Tree

Daughter’s Age VeryGood Puzzle

Skiing on Mountains Matrix

Linked List V/S Binary Search Tree

Find the element that appears once others appears thrice

Python List

Find two non repeating elements in an array of repeating elements

Test Cases for Round Function

SAP Off Campus Hiring_ March 2015 Computer Skills

Find next greater number with same set of digits

Client Server C program

Inorder and Preorder traversals of a Binary Tree given. Output the Postorder traversal of it.

SAP Off Campus Hiring_ March 2015 Verbal Skills

Copyright © 2025 · Genesis Framework · WordPress · Log in