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

牛牛的链表交换

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

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

//单向循环链表
typedef struct node
{
    int data;
    struct node *next;
}node;

//创建头节点
node *add_head()
{
    node *Head = (node *)malloc(sizeof(node));
    if(Head == NULL)
        return NULL;
    Head->next = Head;
    return Head;
        
}

//尾插法
void add_node(node *Head,int data)
{
    node *new = (node*)malloc(sizeof(node));
    if(new == NULL)
        return;
    //节点成员赋值
    new->data = data;
    new->next = NULL;
    //链接
    
        node *pT = NULL;
        for(pT = Head;pT->next != Head;pT = pT->next);
        
        new->next = pT->next;
        pT->next = new;
}

//节点交换
void swap_node(node *Head)
{
    node *p1 = Head->next;//第一个节点
    node *p2 = Head->next->next;//第二个节点
    //前两个节点交换
    p1->next = p2->next;
    p2->next = p1;
    Head->next = p2;
    
    node *pT = NULL;
    node *pT1 = NULL;
    node *pT2 = NULL;
    for(pT = Head;pT->next->next->next != Head;pT = pT->next);//找到倒数第三个节点
    for(pT1 = Head;pT1->next->next != Head;pT1 = pT1->next);//倒数第二个
    for(pT2 = Head;pT2->next != Head;pT2 = pT2->next);//最后一个节点
    //后两个节点交换
    pT1->next = Head;
    pT2->next = pT1;
    pT->next = pT2;
}
//输出链表
void output(node *Head)
{
    if(Head->next == Head)
        return;
    node *pT = Head->next;
    while(pT != Head)
    {
        printf("%d ",pT->data);
        pT = pT->next;
    }
}

int main(void)
{
    node *Head = add_head();//头节点
    int n,i,j;
    scanf("%d",&n);
    int arr[n];
    
    //将键盘键入的数据存放到数组中
    for(i = 0;i < n;i++)
        scanf("%d",&arr[i]);
    
    //将数据插入链表
    for(j = 0;j < n;j++)
        add_node(Head, arr[j]);
    swap_node(Head);
    output(Head);
    
    return 0;
}

全部评论
为什么都不要free掉malloc的空间啊?
点赞 回复 分享
发布于 2023-11-30 21:36 北京
我写的交换,你写的太复杂了!会费很多CPU void swapNode(list &L) { int listNum=0; list tem1 = NULL; list tem2 = NULL; tem1=L->Next;//第一个链表 tem2=L->Next->Next;//第二个链表 tem1->Next=tem2->Next;//第一个链表挪到第二个链表之前要获取第三个链表的节点地址 tem2->Next=tem1;//新第一个链表指向原来的第一个链表; L->Next=tem2;//头链表只想信得第一个链表 list test=NULL,test1=NULL,test2=NULL,test3=NULL;//分别代表他的倒数的3,2,1组链表 test =L; while(test->Next->Next->Next!=NULL) { test=test->Next; } test1=test; test2=test->Next; test3=test->Next->Next; test1->Next=test3; test3->Next=test2; test2->Next=NULL; }
点赞 回复 分享
发布于 2023-07-20 16:19 山东
有BUG,如果结点为空,你的程序就崩了,不严谨
点赞 回复 分享
发布于 2023-07-20 08:53 山东

相关推荐

水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
07-15 11:41
门头沟学院 Java
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

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