题解 | #牛牛的链表交换#
牛牛的链表交换
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;
}
查看5道真题和解析