zoukankan      html  css  js  c++  java
  • Reversing Linked List(根据输入序列对其做部分或全部反转)

    题目:Given a constant KK and a singly linked list LL, you are supposed to reverse the links of every KK elements on LL.

    For example, given LL being 1→2→3→4→5→6, if K = 3 K=3, then you must output 3→2→1→6→5→4;

    if K = 4, you must output 4→3→2→1→5→6.

    //样本测试:

    输入(输入乱序):

    00100 6 4
    00000 4 99999
    00100 1 12309
    68237 6 -1
    33218 3 00000
    99999 5 68237
    12309 2 33218

    输出(根据首行地址输入排序,在排序后进行反转):
    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1
    //代码如下:经过调试最后Rear中数据存贮如输出所示
    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<malloc.h>
    #include<string>
    #include<queue>
    #include<stack>
    using namespace std;
    //创建链表
    typedef struct PNode
    {
        int address;
        int Data;
        int  Next;
        
        PNode *next;
        struct PNode():address(NULL),Data(NULL),next(NULL),Next(NULL){}
    }*Node;
    
    //-------------------------------输入地址为int型数据(我不知输入数据类型,现在只是当其为整数型)--------------
    Node readinput()
    {                
                    int D=0,N=0,K=0;      int D1=0,N1=0,P1=0;int n1;
    
                    Node P,Rear,Head,t;
                    P=(Node)malloc(sizeof(Node));P->next=NULL;
                    Rear=P;t=P;
                    queue<int>a,c;stack<int>b;
                
                    scanf("%d%d%d",&D1,&N1,&P1);
                    n1=N1;
    //-------------------------开始将数据输入到链表中----------------------
                    while(n1--)
                    {
                        scanf("%d%d%d",&D,&N,&K);
                        P->address=D;
                        P->Data=N;
                        P->Next=K;
                        Head=(Node)malloc(sizeof(Node));
                        
                        P->next=Head;
                        P=P->next;
                        Head->next=NULL;
                    
                    }
                    P=NULL;
    //------------开始通过最初的地址进行排序-------------------------------
    //------------查找排序,引入队列---------------------------------------
        
                
                    for(int i=0;i<N1;i++)
                    {        t=Rear;
                        while(t->next!=NULL&&t->Data!=NULL)
                            {
                                if(t->address==D1)
                                    {  
                                    a.push(t->Data);//先压数据,在压地址
                                    a.push(t->address);//将序列的地址压入到了队列中,用链表做有点吃亏
                                                                    
                                    b.push(t->Next);
                               }
                                t=t->next;
                    }
                        D1=b.top();
                        b.pop();
                    }
                    
    
                    for(int i=0;i<a.size();i++)
                    {
                        if(a.front()==P1)
                        {        
                                break;
                        }
                        else
                        {
                        b.push(a.front());
                            a.pop();
                        b.push(a.front());
                            a.pop();
                        }
                    }
                
                        b.push(a.front());
                            a.pop();
                        b.push(a.front());
                            a.pop();
                            
                
                    while(!b.empty())
                        {
                            c.push(b.top());
                            b.pop();
                        }
                
                    while (!a.empty())
                    {        int d=a.front();
                                a.pop();
                            c.push(a.front());
                            a.pop();
                            c.push(d);
    //---------------为了保持顺序一致性---------------------
                    }
                    t=Rear;int tmp=N1;
                    while(tmp--)
                    {
                        if(t->next!=NULL)
                        {
                            t->address=c.front();
                            c.pop();
                            t->Data=c.front();
                            c.pop();
                            if(!c.empty())
                            t->Next=c.front();
                            else
                            {
                                t->Next=-1;
                            }
                            t=t->next;
                        }
                    
                    }
    
    return Rear;
    }
    
    int main()
    {        
                Node p1;
                p1=readinput();
    
    return 0;
    }
    
    
    


  • 相关阅读:
    Python表达式与生成式
    Python三大器之生成器
    Python三大器之迭代器
    Arrays.asList基本用法
    理解静态绑定与动态绑定
    Comparable 和 Comparator的理解
    @SuppressWarnings 用法
    @SafeVarargs 使用说明
    LeetCode43,一题让你学会高精度算法
    分布式——吞吐量巨强、Hbase的承载者 LSMT
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/5415869.html
Copyright © 2011-2022 走看看