链表【3】

反转链表

因为学了带头节点,所以用带头节点翻转,发现反转后首尾会有脏数据

事实上这里一开始获取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);
}

 

 

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值