zoukankan      html  css  js  c++  java
  • 链表部分逆置

    题目

    给定一个固定的单链表,输入两个数begin和end。将下标为begin到end之间的内容逆置。

    给定的单链表为:0->2->4->6->8->10->12->14->16->18

    测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin

    样例输入

    2 4

    样例输出

    0->2->8->6->4->10->12->14->16->18

    分析:如果从头结点开始逆置,则将最后一个节点变为头结点,第一个节点指向尾结点后面的元素,中间的指向倒转即可。如果不是从头结点开始,还要再记录头结点前一个节点。

    代码

    #include <iostream>
    using namespace std;
    struct List
    {
        int num;
        List *next;
    };
    List *head;
    void reverse(int begin, int end, List *&head)
    {
        List *b;
        int sum=0;
        b=head;
        while(1)
        {
          if(begin==0)//需要三个指针,前两个分别指向要逆置的两个节点,第三个指向后面的一个节点
           {
               List *k=head;
               List *x=head->next,*y;
               for(int i=0;i<end-begin;i++)//循环逆置
               {
                   if(x->next!=NULL)
                       y=x->next;
                   else
                       y=NULL;
                   x->next=k;
                   k=x;
                   x=y;
               }
               head=k;
               b->next=y;
               break;
           }
           else if (sum==begin-1)//同上
           {
               List *bb=b->next;
               List *k=bb;
               List *x=bb->next,*y=x;
               for(int i=0;i<end-begin;i++)
               {
                   if(x->next!=NULL)
                   y=x->next;
                   else
                       y=NULL;
                   x->next=k;
                   k=x;
                   x=y;
               }
               b->next=k;
               bb->next=y;
               break;
           }
           else
           {
               if(b->next!=NULL){
                b=b->next;
                sum++;}
            }
           
       }
    }
    List *Create()
    {
        List *p = NULL;
        List *q = NULL;
        head = NULL;
        for ( int i = 0; i < 10; i++ ) {
            p = new List;
            p->num = i * 2;
            if ( head == NULL ) {
                head = p;
            }
            else {
                q->next = p;
            }
            q = p;
        }
    
        if ( head != NULL ) {
            q->next = NULL;
        }
    
        return head;
    }
    void displayList(List *head)
    {
        while ( head != NULL ) {
            cout << head->num;
            head = head->next;
            if ( head != NULL ) {
                cout << "->";
            }
        }
        cout << endl;
    }
    
    int main() {
        Create();
        int begin, end;
        cin >> begin >> end;
        reverse(begin, end, head);
        displayList(head);
        return 0;
    }

  • 相关阅读:
    SQL Server 百万级数据提高查询速度的方法(转)
    sql优化的几种方法
    MyBatis中调用存储过程和函数
    android ipc通信机制之二序列化接口和Binder
    APK的目录结构
    android Handler错误,不同的包Handler
    BaiduMap开发,获取公交站点信息。
    GitHub托管项目步骤
    Mysql,JDBC封装
    简单工厂模式练习
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583372.html
Copyright © 2011-2022 走看看