swap in doubly linked list

后端 未结 2 729
臣服心动
臣服心动 2021-01-22 14:45

I am trying to swap two nodes in a doubly linked list. Below is the part of program having swap function.

 int swap (int x, int y)
{
    struct node *temp = NU         


        
2条回答
  •  被撕碎了的回忆
    2021-01-22 15:09

    The code will fail if ptr1 == head (ptr1->prev == NULL) or ptr2 == head (ptr2->prev == NULL), because it ends up trying to use head->next, which doesn't exist. There also needs to be a check for the end of a list, if ptr1->next == NULL or ptr2->next == NULL, which can be handled using a local tail pointer. Using pointers to pointer to node can simplify the code. For example the pointer to next pointer to ptr1 could be &ptr1->prev->next or &head. The pointer to prev pointer to ptr2 could be &ptr2->next->prev or &tail (and set tail = ptr2).

    Using pointers to pointer to node fixes the issue with swapping adjacent nodes. Also temp can be a pointer to node.

    Example code using pointers to nodes (instead of counts) to swap:

    typedef struct node NODE;
    /* ... */
    NODE * SwapNodes(NODE *head, NODE *ptr1, NODE *ptr2)
    {
    NODE **p1pn;            /* & ptr1->prev->next */
    NODE **p1np;            /* & ptr1->next->prev */
    NODE **p2pn;            /* & b->prev->next */
    NODE **p2np;            /* & b->next->prev */
    NODE *tail;             /* only used when x->next == NULL */
    NODE *temp;             /* temp */
        if(head == NULL || ptr1 == NULL || ptr2 == NULL || ptr1 == ptr2)
            return head;
        if(head == ptr1)
            p1pn = &head;
        else
            p1pn = &ptr1->prev->next;
        if(head == ptr2)
            p2pn = &head;
        else
            p2pn = &ptr2->prev->next;
        if(ptr1->next == NULL){
            p1np = &tail;
            tail = ptr1;
        } else
            p1np = &ptr1->next->prev;
        if(ptr2->next == NULL){
            p2np = &tail;
            tail = ptr2;
        }else
            p2np = &ptr2->next->prev;
        *p1pn = ptr2;
        *p1np = ptr2;
        *p2pn = ptr1;
        *p2np = ptr1;
        temp = ptr1->prev;
        ptr1->prev = ptr2->prev;
        ptr2->prev = temp;
        temp = ptr1->next;
        ptr1->next = ptr2->next;
        ptr2->next = temp;
        return head;
    }
    

提交回复
热议问题