题目简述:
解析:
(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;