Friday, June 24, 2016

swap nodes in linked list

Without swapping just the data/value.

- n1, n2 are apart (1+ nodes).
- n1, n2 are adjacent i.e. n1->n2 or n2->n1.
- n1, n2 could be head or tail.
- n1, n2 may not exist in linked list.
//case 1:
pn1-n1-an1
pn2-n2-an2

//case 2:
pn1-n1-n2-x
//case 3:
pn2-n2-n1-x

In each cash, n1 or n2 could be head or tail.
For singly linked list:
singly-linkedlist:
    node head, tail
    
    swap(n1, n2):
        if head == null || n1 == null || n2 == null:
            throw
        if n1 == n2:
            return
        pn1 = previous(n1)
        pn2 = previous(n2)
        if n1.next == n2:
            // n1->n2
            if pn1 != null:
                pn1.next = n2
            n1.next = n2.next
            n2.next = n1            
        else if n2.next == n1:
            // n2->n1
            if pn2 != null:
                pn2.next = n1
            n2.next = n1.next
            n1.next = n2
        else:
            an1 = n1.next
            an2 = n2.next
            if pn1 != null:
                pn1.next = n2
            n2.next = an1
            if pn2 != null:
                pn2.next = n1
            n1.next = an2
        // head
        if n1 == head:
            n2 = head
        else if n2 == head:
            n1 = head
        // tail
        if n1 == tail:
            n2 = tail
        else if n2 == tail:
            n1 = tail

    node previous(x):
        if head == null || x == null:
            throw
        if x == head:
            return null
        prev = null
        n = head
        while n != null:
            if n == x:
                break
            prev = n
            n = n.next
        if n == null:
            throw "x not present"
        return prev
For doubly linked list:
doubly-linkedlist:
    node head, tail
    
    swap(n1, n2):
        if head == null || n1 == null || n2 == null:
            throw
        if n1 == n2:
            return
        pn1 = previous(n1)
        pn2 = previous(n2)
        if n1.next == n2:
            // n1->n2
            x = n2.next
            if pn1 != null:
                pn1.next = n2
            n2.prev = pn1
            n1.next = x
            if x != null:
                x.prev = n1
            n2.next = n1
            n1.prev = n2
        else if n2.next == n1:
            // n2->n1
            x = n1.next
            if pn2 != null:
                pn2.next = n1
            n1.prev = pn2
            n2.next = x
            if x != null:
                x.prev = n2
            n1.next = n2
            n2.prev = n1        
        else:
            an1 = n1.next
            an2 = n2.next
            if pn1 != null:
                pn1.next = n2
            n2.prev = pn1
            n2.next = an1
            if an1 != null:
                an1.prev = n2
            if pn2 != null:
                pn2.next = n1
            n1.prev = pn2
            n1.next = an2
            if an2 != null:
                an2.prev = n1
        // head
        if n1 == head:
            n2 = head
        else if n2 == head:
            n1 = head
        // tail
        if n1 == tail:
            n2 = tail
        else if n2 == tail:
            n1 = tail
[Hat tip to PC]

No comments:

Post a Comment