【数据结构】NOJ002—线性表的就地逆置

题目简述:

 解析:

(1)数组的就地逆置使用一个临时变量两两进行交换即可;

(2)链表的就地逆置可以直接使用头插法建立链表;

重点:

(1)链表的头插法和尾插法

(2)链表的前插入和后插入方法(上篇博客);

代码:

其实此处逆置数组和链表时,可以在输入数字的时候直接输入一个令其等于a[n-i]就可以原地逆置数组,但我还是单独写出来逆置,并且将链表逆置也单独写了一个函数。

#include <iostream>

using namespace std;

struct ListNode{
    int value;
    ListNode *next;
};

//使用头插法建立链表
void Creat_LinkList(ListNode *phead,int n,int *a){
    ListNode *p=phead;
    for(int i=0;i<n;i++)
    {
        ListNode *newNode=new ListNode;
        newNode->value=a[i];
        newNode->next=p->next;
        p->next=newNode;
    }
}
int main()
{
    int n;
    cin>>n;
    int *a=new int[n];
    for(int i=0;i<n;i++)
        cin>>a[i];

    //就地逆置链表直接头插法实现
    ListNode *head=NULL;
    head=new ListNode;
    head->next=NULL;
    head->value=0;
    Creat_LinkList(head,n,a);

    //就地逆置数组
    for(int i=0;i<n/2;i++)
    {
        int num;
        num=a[i];
        a[i]=a[n-i-1];
        a[n-i-1]=num;
    }

    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;

    ListNode *p=head;
    while(p->next!=NULL)
    {
        p=p->next;
        cout<<p->value<<" ";
    }

    return 0;
}

总结:

(1)链表的头插法和尾插法

头插法(两步):

——首先新节点next指向头节点next

——接下来头节点next指向新节点

尾插法(三步):

——建立临时节点p,等于头指针head:p=head;

——新节点next指向NULL(即新节点是最后一个节点);

——p的next指向新节点

——将p后移一位,令p等于目前最后一个节点,即新节点:p=newNode;

总的来说,头插法两步不需要尾节点,尾插法三步,需要中间节点p不断移动作为尾节点

//使用头插法建立链表
void Creat_LinkList_HeadInsertion(ListNode *phead,int n){
    ListNode *p=phead;
    for(int i=0;i<n;i++)
    {
        ListNode *newNode=new ListNode;
        cin>>newNode->value;
        newNode->next=p->next;
        p->next=newNode;
    }
}

//使用尾插法建立链表
void Creat_LinkList_TailInsertion(ListNode *phead,int n){
    ListNode *p=phead;
    for(int i=0;i<n;i++)
    {
        ListNode *newNode=new ListNode;
        cin>>newNode->value;
        newNode->next=NULL;
        p->next=newNode;
        p=newNode;
    }
}

(2)链表的前插和后插

//将newNode插入到p后面:直接插入节点
newNode-next=p->next;
newNode->value=X;
p->next=newNode;
 
//将newNode插入到前面:先保存值,再插入节点
newNode->value=p->value;
p->value=X;
newNode-next=p->next;
p->next=newNode;
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值