How exactly does a XOR Linked list work?

前端 未结 5 2122
悲哀的现实
悲哀的现实 2020-12-16 10:15

The following link explains it.
The implementation is said to work by storing the XOR of the previous and next address(say nxp), instead of storing both(previous and

5条回答
  •  一向
    一向 (楼主)
    2020-12-16 10:50

    Let us consider the following XOR list

    A->B->C->D

    suppose you created nodes in this format below

    Key|Link|

    A|0^addr(B)| ->  B|addr(A)^addr(C)|  ->  C|addr(B)^addr(D)| -> D|addr(C)^0|
    

    CASE #1:[Forward Traversal] Now Suppose you are in B (current_node=>B) want visit C , so you need Address of C . How you will get ?

    Addressof(Next_node) = addressof(Prev_node) ^ Current_node(Link)

    addr(A)^ ( addr(A)^ addr(C) )
    =>(addr(A) ^ addr(A)) ^ addr(C) 
    => 0 ^ addr(C)
    =>addr(C)
    

    CASE #2: [Backward traversal] Now Suppose you are in C (current_node=> C) want visit B , so you need Address of B . How you will get ?

    Addressof(Prev_node) = addressof(Next_node) ^ Current_node(Link)

    addr(D) ^ ((addr(B) ^ addr(D)) 
    => (addr(D)^ addr(D)) ^ addr(B)
    => 0^addr(B)
    => addr(B)
    

    Traversing: To traverse whole list ,You will need 3 pointers prevPtr , currPtr , nextPtr to store relative current, previous and next node's address starting with head. Then in each iteration these pointers need be move to one position ahead.

    struct Node *currPtr = head;
    struct Node *prevPtr = NULL;
    struct Node *nextPtr;
    
    printf ("Following are the nodes of Linked List: \n");
    
    while (currPtr != NULL)
    {
        // print current node
        printf ("%d ", currPtr->key);
    
        // Save the address of next node
        nextPtr = XOR (prevPtr, currPtr->link);
    
        //move prevPtr and currPtr one position for next iteration
    
        prevPtr = currPtr;
        currPtr = nextPtr;
    }
    

提交回复
热议问题