题解 | #牛牛的链表交换#

牛牛的链表交换

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

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

typedef struct LNode{
    int data;
    struct LNode* next;
}LNode,*LinkLsit;

void Insert(LinkLsit L,int X){ //尾插法插入新结点
    LNode* p=L;
    while(p->next!=NULL){ //带头结点的单链表,不用单独考虑空链表时的情况
        p=p->next;
    }  //p->next为空则退出循环,说明找到最后一个结点,最后一个结点的next指向NULL

    LNode* newnode=(LNode*)malloc(sizeof(LNode));
    newnode->data=X;
    newnode->next=p->next;
    p->next=newnode;

}

void SwapElem(LinkLsit L,int length){//链表长度length=数组长度n
    LNode* p=L->next;
    int j=1;//从实际存储数据的结点1开始,最后一个结点为length,注意不是数组,所以不用-1
    while(p!=NULL){
        if(j==1){ //如果此时遍历到的是第1个节点,1号结点和2号结点存储的值相交换
            int temp = p->data;
            p->data=p->next->data;
            p->next->data=temp;
        }
        if(j==length-1){ //如果此时遍历到的是倒数第2个节点,第length-1号结点和第length号结点交换存储的值
            int temp = p->data;
            p->data=p->next->data;
            p->next->data=temp;
        }
        p=p->next;
        j++;
    }

}


int main() {
    LinkLsit L;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;

    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }

    for(int i=0;i<n;i++){
        Insert(L,a[i]);
    }
    SwapElem(L,n);

    LNode* p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
Rac000n:淘天-客户运营部-AI研发工程师,智能客服方向,暑期实习招聘,欢迎联系
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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