题解 | 牛牛的链表交换

牛牛的链表交换

https://www.nowcoder.com/practice/0e009fba6f3d47f0b5026b5f8b0cb1bc

#include <stdio.h>
#include <stdlib.h>

// write your code here......
struct ListNode {
    int nodeVal;
    struct ListNode * next;
};


int main() {

    int n, val, i;
    scanf("%d",&n);

    struct ListNode * pHeadNode;
    struct ListNode *p, *pLastPrev,*pLastPrevPrev,*pLast, *pTemp1, *pTemp2;

    pHeadNode = (struct ListNode *) malloc(sizeof(struct ListNode));
    if(!pHeadNode) {
        return -1;
    }

    for (i = 1; i <= n; i++) {
        scanf("%d",&val);
        p = (struct ListNode *) malloc(sizeof(struct ListNode));
        if(p) {
            p->nodeVal = val;
            p->next = NULL;
            //printf("p->nodeVal = %d", p->nodeVal);
        }

        if(i == 1) {
            pHeadNode->next = p;
            pLast = pLastPrev = p;
            pLastPrevPrev = p;
        }
        else if ( i <= 3) {
            pLast->next = p;
            pLastPrev = pLast;              
            pLast = p; 
        }
        else {
            pLast->next = p;
            pLastPrevPrev = pLastPrev;
            pLastPrev = pLast;              
            pLast = p; 
        }

    }


    if(n >= 3 && n <= 4) {
        if(pHeadNode->next != NULL && pHeadNode->next->next != NULL) {
            pTemp1 = pHeadNode->next;
            pTemp2 = pHeadNode->next->next->next;
            pHeadNode->next->next->next = pTemp1;
            pHeadNode->next = pHeadNode->next->next;
            pTemp1->next = pTemp2;
        }


        for (i = 1, p = pHeadNode->next; i <= n; i++) {
            if(i == 1) {
                pLast = pLastPrev = p;
                pLastPrevPrev = p;
            }
            else if ( i <= 3) {
                pLast->next = p;
                pLastPrev = pLast;              
                pLast = p; 
            }
            else {
                pLast->next = p;
                pLastPrevPrev = pLastPrev;
                pLastPrev = pLast;              
                pLast = p; 
            }

            p = p->next;

        }

        pLastPrevPrev->next = pLast;
        pLast->next = pLastPrev;
        pLastPrev->next = NULL;

    }
    else if (n >= 5) {
        if(pHeadNode->next != NULL && pHeadNode->next->next != NULL) {
            pTemp1 = pHeadNode->next;
            pTemp2 = pHeadNode->next->next->next;
            pHeadNode->next->next->next = pTemp1;
            pHeadNode->next = pHeadNode->next->next;
            pTemp1->next = pTemp2;
        }


        pLastPrevPrev->next = pLast;
        pLast->next = pLastPrev;
        pLastPrev->next = NULL;

    }


    p = pHeadNode->next;

    while(p != NULL) {
        printf("%d ", p->nodeVal);
        p = p->next;
    }

    // write your code here......
    

    return 0;
}

全部评论
n = 3, 4的时候,前面的翻转,链表中LastPrevPrev节点会发生变化, 需要做特殊处理。 n<=2, 两次翻转,不会有变化;n >=5时,前后的翻转,互不影响。
点赞 回复 分享
发布于 05-28 17:45 广东

相关推荐

昨天 18:31
成都理工大学 C++
点赞 评论 收藏
分享
粗心的熊熊求求offer:什么内容都没有还弄两页
点赞 评论 收藏
分享
喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务