链表部分逆置

题目

给定一个固定的单链表,输入两个数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;
}

原文地址:https://www.cnblogs.com/nickqiao/p/7583372.html