表逆置[数组和链表]

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

中间需要一个临时变量暂存数据,看似简单,其实有点绕,关键还是数组下标从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;
}
时间: 2024-11-17 11:55:06

表逆置[数组和链表]的相关文章

C语言:【单链表】逆置反转单链表

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

线性表&gt;&gt;顺序表---&gt;逆置所有元素

1 /*顺序表中所有的元素逆置 2 * 3 */ 4 #include <iostream.h> 5 using namespace std; 6 7 int main(){ 8 void reverse_arr(int arr[],int n); 9 int a[]={0,1,2,3,4,5,6,7}; 10 int n=7; 11 reverse_arr(a,n); 12 for(int i=0;i<=n;i++){ 13 cout << a[i] << &q

C 求最大数,逆置数组 冒泡法

求第一,第二,第三大的值 #include <stdio.h> int main(){     int arr1[10]={1,3,2,5,4,7,5,6,9};      int max        =0;     int second_max =0;     int third_max  =0; for(int a=0;a<10;a++){ if(arr1[a] > max){ third_max  =second_max; second_max =max; max     

设计一个算法将一个顺序表逆置

#include<iostream> #include<malloc.h> using namespace std; typedef struct { int length;//保存长度 int data[40];//数组 } SqList; /*算法1:设计一个高效的算法,将顺序表中的所有元素逆置.要求算法空间股咋度为o(1)*/ //初始化顺序表 void initReverse(SqList &s,int *a,int l){ s.length=0; //插入元素 f

线性表逆置

建立长度为n的顺序表,然后将表中的数据元素逆置,即若表中原来的数据元素序列为(a0,a1,a2,-,an),则逆置后的数据元素序列为(an,an-1,an-2,-,a1,a0).(数据类型为字符型) Description 第一行为顺序表的长度n: 第二行为顺序表中的数据元素: Input 输出为逆置后的顺序表 Output 1 2 3 7 A B C D E F G Sample Input 1 G F E D C B A Sample Output #include<stdio.h> in

程序员修炼之路-(2)线性表(上):数组与链表

1 两块基石 数组与链表构成各种数据结构的基石,是实现所有数据结构必不可少的元素. 1.1 数组 数组一般内置于编程语言中,直接通过索引(index)读写.索引一般为数字,有的语言甚至直接支持如字符串等其他类型的索引.在很多数据结构中都能看到数组的身影,例如字符串.动态数组.堆.栈和队列(用链表也可以,但用数组实现很高效)等. 1.2 链表 概念上都能理解,但实现起来还真有很多容易出错的地方. 实现细节 ?  表头(header):为什么要添加一个表头?因为有了表头,在第一个结点前添加结点或删除

(LeetCode)Rotate Array --- 逆置数组

Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. Note: Try to come up as many solutions as you can, there are at least 3 different ways to solve this pr

逆置/反转单链表

void Reverse (PLinkList* ppList) { Node* newHead = NULL; assert(ppList); if (*ppList != NULL) { // 取第一个节点做新的头结点 newHead = *ppList; Node* begin = (*ppList)->next; newHead->next = NULL; // 取节点进行头插 while (begin != NULL) { Node* tmp = begin; begin = beg

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g