反转链表
因为学了带头节点,所以用带头节点翻转,发现反转后首尾会有脏数据
事实上这里一开始获取current时就应该等于head-》next,而不是head,
最后打印数组,也应该从带头节点的下一位开始打印
总算也自己写了一个int+node*next的
#include<stdio.h>
const int N=105;
int n,first;
using namespace std;
struct node
{
int data;node* next;
} ;
node lnode[N];
node* create()
{
int nn=5;
int array[]={1,2,5,6,3};
node *head,*p,*pre;
head=new node;head->next=NULL;pre=head;
for(int i=0;i<nn;i++)
{
p=new node;
p->data =array[i];
p->next =NULL;
pre->next=p;
pre=p;
}
return head;
}
//这是标程
node* reverseList(node* head) {
node *prev = nullptr;
node *cur = head;
while (cur)
{
node *next = cur->next;
cur->next = prev;
prev = cur, cur = next;
}
return prev;
}
//这是我写的
node* rearrangedList(node* head) {
node *current,*pre,*next;
current=head->next;pre=NULL;
while(current!=NULL)
{
next=current->next;
current->next=pre;
pre=current;
current=next;
}
next=new node;
next->next=pre;
return next;
}
/*
void readin()
{
for(int i=0;i<n;i++)
{ int idtemp;scanf("%d",&idtemp);
scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
}
}
void insertNode(node* head,int pos,int data)
//在头结点为node*的第pos节点插入一个值为data的节点
{
//首先遍历链表到待定位置的前驱节点
//node* p=head;
//int id1,data1;
//node p1;
//p1.data=data;
//int id2;
node* p;node* current;
current=head;
for(int i=0;i<pos-1;i++)
{current=current->next ;
}
p=new node;
p->data =data;
p->next =current->next ;
current->next =p;
}
*/
int main()
{
node* head1=create();
head1=rearrangedList(head1);
node* cur=head1->next;
while (cur!=NULL)
{printf("%d\n",cur->data);cur=cur->next;
}
// scanf("%d %d",&n,&first);
// int itern=first;
// readin();
// int ans=0;
// while(1)
// {
// ans++;
printf("%d %d %d\n",itern,lnode[itern].data,lnode[itern].next);
// itern=lnode[itern].next;
// if(itern==-1)break;
// }
// printf("%d",ans);
}
接下来就是静态链表刷几道题。
头插法(插在链表最初)
#include<stdio.h>
const int N=1005;
int n,first,firstid;
using namespace std;
struct node
{
int data;int next;
} ;
node lnode[N];
void readin()
{
for(int i=0;i<n;i++)
{ int idtemp;scanf("%d",&idtemp);
scanf("%d %d",&lnode[idtemp].data,&lnode[idtemp].next);
}
}
int touchafa(int id,int data)
{
lnode[id].data=data;lnode[id].next=firstid;
return id;
}
int main()
{
scanf("%d %d",&n,&firstid);
// int itern=first;
readin();int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{int id2,data2;
scanf("%d %d",&id2,&data2);
firstid=touchafa(id2,data2);
}
while(firstid!=-1 )
{
printf("%d %d %d\n",firstid,lnode[firstid].data,lnode[firstid].next);
firstid= lnode[firstid].next;}
// int ans=0;
// while(1)
// {
// ans++;
printf("%d %d %d\n",itern,lnode[itern].data,lnode[itern].next);
// itern=lnode[itern].next;
// if(itern==-1)break;
// }
// printf("%d",ans);
}