3. 链表原地逆序

成绩5开启时间2021年09月17日 星期五 14:00
折扣0.8折扣时间2021年09月30日 星期四 23:59
允许迟交关闭时间2021年10月17日 星期日 23:59

请编写函数 void inverse( LinkList ),实现单链表的原地置逆。即利用原来的结点将线性表:L =(a1, a2, …… , an)

变换为:L =( an,  …… , a2, a1)

说明:本题目为经典的单链表算法设计题目,简单而有内涵。预设代码中仅用到了C++中的个别东西,但没有采用面向对象的编程方式。

预设代码

前置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
 
#include <iostream>  
using namespace std;  
  
typedef int ElemType;  
typedef struct node  
{   ElemType    data;  
    struct node * next;  
} NODE;  
typedef NODE * LinkList;  
  
void output( LinkList );  
void change( int, int, NODE * );  
LinkList createList( ElemType );  
void inverse( LinkList );   
  
LinkList createList( ElemType finish )  //finish:数据结束标记   
{  
    ElemType x;  
    NODE *newNode;   
    LinkList first = new NODE;   // 建立头结点  
    first->next = NULL;  
    first->data = finish;  
    cin >> x;                 // 约定以finish结束连续输入  
    while ( x != finish )  
    {  
        newNode = new NODE;      // 建立新结点  
        newNode->data = x;  
        newNode->next = first->next; // ①  
        first->next = newNode;       // ②  
        cin >> x;  
    }  
    return first;  
}  
  
void output( LinkList head )  
{   cout << "List:";  
    while ( head->next != NULL )  
    {   cout << head->next->data << ",";  
        head = head->next;  
    }  
    cout << endl;  
}  
  
int main(int argc, char** argv)   
{  
    LinkList head;  
  
    head = createList( -1 );  
    output( head );  
    inverse( head );  
    output( head );  
    return 0;  
}  
  
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */  
测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 10 20 30 40 -1↵
以文本方式显示
  1. List:40,30,20,10,↵
  2. List:10,20,30,40,↵
1秒64M0
测试用例 2以文本方式显示
  1. 10 -1↵
以文本方式显示
  1. List:10,↵
  2. List:10,↵
1秒64M0

 代码

void inverse(LinkList head){    
    LinkList p=head->next;    
    head->next=NULL;    
    while(p!=NULL){    
        LinkList q=p->next;    
        p->next=head->next;    
        head->next=p;    
        p=q;    
    }    
} 

代码图解

初始状态(L是头结点)

 第一步

    LinkList p=head->next;    
    head->next=NULL;

第二步

        LinkList q=p->next;    
        p->next=head->next;   

之所以要有这个q指针,是为了不丢失结构体2以及其之后结构体的地址。先用q把2的地址存起来,再让1的next指向别的地方。

第三步

        head->next=p;    
        p=q;

p指向下一个结构体,进入下一轮循环

重复这三步

    while(p!=NULL){    
        LinkList q=p->next;    
        p->next=head->next;    
        head->next=p;    
        p=q;    
    } 

 

 

这样看上去很乱,其实就是把原来的L->1->2逆序成了L->2->1,后面的结构体也同理,有兴趣的可以自己画画试试

建议大家不要直接Ctrl+c+v,尽管BIT的编程课对于新手不是很友好,但其实自己多琢磨一会就能想明白

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值