zoukankan      html  css  js  c++  java
  • 迷之1025 反转链表

    错误的代码:

    #include <cstdio> 
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #include <string>
    using namespace std;
    
    struct Node
    {
    	int Nodenow;
    	int Nodenext;
    	int data;
    	Node *next;
    };
    
    struct store
    {
    	int now;
    	int next;
    	int data;
    }a[100005],b[100005];
    
    int turn[100005];
    
    void Node_Print(Node *head)
    {
    	Node *p = head;
    	
    	while(p != NULL)
    	{
    		if(p -> Nodenext != -1)
    		printf("%05d %d %05d",p->Nodenow,p -> data,p -> Nodenext);
    		else
    		{
    			printf("%05d %d %d",p->Nodenow,p -> data,p -> Nodenext);
    		}
    		p = p -> next;
    		
    		if(p != NULL)printf("
    ");
    	}
    }
    
    Node * ReversePart_Node(Node *head,int start,int end)
    {
    	if(start == end)return head;
    	
    	Node *pPrv = NULL;
    	Node *pNow = head;
    	Node *pNext = NULL;
    	
    	Node *BeforeStart = NULL; //开始的结点前的结点 
    	Node *StartNode = NULL; //开始的时候的结点
    	int i,j;
    	//for循环指向需要反转的位置 
    	for(i = 1; i <= start; i++)
    	{
    		if(i == start)
    		{
    			BeforeStart = pPrv;
    			StartNode = pNow;
    		}
    		
    		pPrv = pNow;
    		pNow = pNow -> next;
    		pNext = pNow -> next;
    	}
    	
    	for(i = 1; i <= end - start; i++)  
    	{
    		pNext = pNow -> next; //保存下一个 
    		pNow -> next = pPrv; //改变指向 
    		pPrv = pNow; //移动 pPrv和 pNow 
    		pNow = pNext;
    	}
    	
    	//反转部分 未反转前的第一个结点 反转之后变成该反转部分的最后一个结点 
    	StartNode -> next = pNow; //连接 
    	
    	if(BeforeStart == NULL) //从head开始反转 
    	{
    		head = pPrv; //pNow 反转过后是 该反转部分的第一个结点 
    	}
    	else 
    	{
    		BeforeStart -> next = pPrv; //连接反转部分前面的结点 和 该反转部分 
    	}
    	
    	return head;
    }
    
    int inturn(int ibegin,int stot)
    {
    	int i,j,found;
    	int tot = 0;
    	int cnt = 1;
    	
    	if(!turn[ibegin]) return 0;
    	
    	b[cnt++] = a[turn[ibegin]];
    	found = a[turn[ibegin]].next;
    	
    	while(found != -1)
    	{
    		b[cnt++] = a[turn[found]];
    		found = a[turn[found]].next;
    	}
    	cnt--;
    	
    	return cnt;
    }
    
    Node *Node_Creat(int tot)
    {
    	Node *head;
    	head = (Node *)malloc(sizeof(Node));
    	if(head == NULL)
    	{
    		printf("Overflow
    ");
    		exit(1);
    	}
    	
    	head -> data = b[1].data;
    	head -> Nodenow = b[1].now;
    	head -> Nodenext = b[1].next;
    	
    	Node *p1,*p2;
    	p1 = p2 = head;
    	for(int i = 2; i <= tot; i++)
    	{
    		p1 = (Node *)malloc(sizeof(Node));
    		if(p1 == NULL)
    		{
    			printf("Overflow
    ");
    			exit(1);
    		}
    		
    		p1 -> data = b[i].data;
    		p1 -> Nodenow = b[i].now;
    		p1 -> Nodenext = b[i].next;
    		
    		p2 -> next = p1;
    		p2 = p1;
    	}
    	p2 -> next = NULL;
    	return head;
    }
    
    int main()
    {
    	int stot,reverse;
    	int ibegin;
    	int i,j;
    	
    	cin >> ibegin >> stot >> reverse;
    	int tot = 0; //结点数 
    	
    	memset(turn,0,sizeof(turn));
    	
    	for(i = 1; i <= stot; i++)
    	{
    	    cin >> a[i].now >> a[i].data >> a[i].next;
    	    turn[a[i].now] = i;
    	}
    	
    	tot = inturn(ibegin,stot);
    	
    	Node *head;
    	head = Node_Creat(tot);
    	
    	for(i = 1; i <= tot/reverse; i++)
    	{
    		head = ReversePart_Node(head, (i - 1)*reverse + 1, i*reverse);
    	}
    	
    	head = changedata(head);
    	
    	Node_Print(head);
    	
    	return 0;
    }
    /*
    00100 12 13
    72222 12 -1
    62222 11 72222
    52222 10 62222
    42222 9 52222
    32222 8 42222
    22222 7 32222
    00000 4 99999
    00100 1 12309
    68237 6 22222
    33218 3 00000
    99999 5 68237
    12309 2 33218
    */
    

    后来根据一些数据的对比,发现反转后的结点下一个地址要发生改变,于是添加了一个函数改变结点中地址的值。

    Node *changedata(Node *head)
    {
    	Node *p = head;
    	
    	while(p -> next != NULL)
    	{
    		p -> Nodenext = p -> next -> Nodenow;
    		p = p -> next;
    	}
    	p -> Nodenext = -1;
    	
    	return head;
    }
    

    改了一下输入方式,但是还是超时(挠头

  • 相关阅读:
    C指针详解(经典,非常详细)
    PL/SQL错误提示 database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
    安装Oracle报错,全部为未知!
    Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装
    Asp.Net页面生命周期
    oracle 导库建立测试库
    宝塔安装建站教程
    SEM理论
    SEM小总结
    SEM大致操作梳理
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5514982.html
Copyright © 2011-2022 走看看