表逆置[数组和链表]

Posted YuRi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表逆置[数组和链表]相关的知识,希望对你有一定的参考价值。

对于数组(也可为线性表),逆置就是首尾数据两两交换,首先计算交换的次数:
技术分享

中间需要一个临时变量暂存数据,看似简单,其实有点绕,关键还是数组下标从0开始,这一点很麻烦!这种小题最练基础!

完整代码:

#include <iostream>
using namespace std;
int main()
{    
    int a[]={1,2,3,4,5,7,8,9};
    int len=sizeof(a)/sizeof(int);/*计算数组长度*/
    int temp;/*临时变量*/
    for(int i=0;i<=(len-1)/2;i++)/*计算交换次数*/
    {
        temp=a[i];
        a[i]=a[len-1-i];/*交换*/
        a[len-1-i]=temp;
    }
    for(i=0;i<len;i++)/*查看结果*/    
    cout<<a[i]<<" ";
    return 0;
}

第二种,链表,这个困难很多,因为链表只有一个头指针,要依赖这个指针对整个链条进行操作,需要很高的技巧!首先观察链表:
技术分享

如果逆置(反序),交换数据是不可能的,只有换种思路,把结点之间的指针指向反转,按照这种思路,头变尾,尾变头,而最困难的是如何改变指针方向?这里采用了步步转换的方法,除头指针L外,还借助两个游标指针q和r辅助移动!

代码

void ReverseList(List &L) /*逆序操作*/
{
    List q,p,r;
    p=L;
    q=p->next;
    p->next=NULL;/*把头结点变成尾结点*/
    while(q!=NULL)/*游标q、r配合L进行操作*/
    {                
        r=q->next;
        q->next=L;
        L=q;
        q=r;    
    }

}


只看代码可能并不难,但是这种转移很巧妙,要背住可能需要多次演练!大概的形式是:

技术分享
L,q,r三者的先后关系看清楚,更容易记忆,L在后,q居中,r总在最前,这是在程序运行过程中产生的顺序,仅仅是一种记忆方式!

完整代码

// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;
typedef struct node
{
    int data;
    struct node *next;
}*List,Node;
void CreatList(List &L)
{
    int e;
    cin>>e;
    if(e==0) /*输入0时链表创建结束*/
    L=NULL;
    else
    {
        L=(List)malloc(sizeof(Node));
        L->data=e;
        CreatList(L->next);
    }
}
void TraverseList(List &L) /*遍历,打印链表*/
{
    while(L)
    {
        cout<<L->data<<" ";
        L=L->next;
    };
}
void ReverseList(List &L) /*逆序操作*/
{
    List q,p,r;
    p=L;
    q=p->next;
    p->next=NULL;/*把头结点变成尾结点*/
    while(q!=NULL)/*游标q、r配合L进行操作*/
    {                
        r=q->next;
        q->next=L;
        L=q;
        q=r;    
    }

}
void DestoryList(List &L)/*销毁*/
{
    if(L)
    {
        List(L->next);
        free(L);
        L=NULL;
    }
}
int main(void)
{
    List L;
    CreatList(L);/*创建*/
    ReverseList(L);/*逆序*/
    TraverseList(L);/*遍历*/
    DestoryList(L);/*销毁*/
    return 0;
}

 

以上是关于表逆置[数组和链表]的主要内容,如果未能解决你的问题,请参考以下文章

[PTA]实验11-2-9 链表逆置

用递归进行链表逆置

单链表类,链表逆置

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)

C++程序设计 编写程序实现单链表逆置功能。

LeetCode #234. Palindrome Linked List 链表 栈 链表逆置