题解 | 牛牛的链表交换

牛牛的链表交换

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

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

// write your code here......
//定义链表节点结构

typedef struct Node
{
    int data;
    struct Node* next;
}Node;
void printList(Node* node)
{
    Node* current = node;
    while(current!=NULL)
    {
        printf("%d",current->data);
        if(current->next!=NULL)
        {
            printf(" ");
        }
        current = current->next;
    }
    printf("\n");
}


int main() {

    int n;
    scanf("%d",&n);
    if(n<2)
    {
        return 0;
    }
    int* arr=(int*)malloc(n*sizeof(int));

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

    // write your code here......
//根据数组创建链表
    Node* head = NULL;
    Node* tail = NULL;
    for(int i=0;i<n;i++)
 {
   Node* newnode = (Node*)malloc(sizeof(Node));
   newnode->data=arr[i];
   newnode->next=NULL;
   if(head==NULL)
{
    head = newnode;
    tail=newnode;
}else {
    tail->next=newnode;
    tail=newnode;
}
 }
//交换前两个节点
Node* first = head;
Node* second= head->next;
first->next = second->next;
 second->next = first; 
      head  = second;//第二个节点成为新节点

//交换最后两个节点
Node* second_last = head;
Node* last = head->next;
Node* before_second_last = NULL;//记录倒数第三个节点
//遍历链表,找到最后两个节点以及它们的前一个节点
while(last!=NULL && last->next !=NULL)
{
    before_second_last = second_last;
    second_last = last;
    last = last->next;
}
//执行交换操作
second_last->next = NULL;
last->next = second_last;
if(before_second_last == NULL)
{
    head = last;    
}else {
before_second_last->next = last;
}
printList(head);//打印最终的链表
free(arr);
return 0;
}


最重要的还是要画图理解,某某指针前进下一位置是什么,中间变量指针很重要。

全部评论
base南京,机会多多
点赞 回复 分享
发布于 09-06 14:27 贵州

相关推荐

评论
点赞
收藏
分享

创作者周榜

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