带头结点
初始化如图
1.我们需要把1这个结点作为最后一个结点,所以要把1的next指向NULL
h->next->next = nullptr;
2.然后我们要新建结点,指向HeadNext的下一位,并把HeadNext的下一位指向HeadPre,
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
3. HeadPre指向HeadNext为下一次循环做准备
HeadPre = HeadNext;
4.如果tempNode为空,说明HeadNext已经是最后一个结点,把头结点的下一位指向HeadNext
if (tempNode == nullptr)
{
h->next = HeadPre;
}
5.将HeadNext往后移一位
HeadNext = tempNode;
6.继续循环,直至HeadNext为空
完整函数
Inode *Test::ReserveLink(Inode *h) {
Inode *HeadNext, *HeadPre;
HeadNext = h->next->next;
HeadPre = h->next;
h->next->next = nullptr;
while (HeadNext)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == nullptr)
{
h->next = HeadPre;
}
HeadNext = tempNode;
}
return h;
}
运行截图
完整程序
#include <iostream>
using namespace std;
typedef struct Link {
int num;
Link *next;
} Inode;
class Test {
public :
Inode *t_CreateList(Inode *Head, int n);//尾插法建立单链表
void ShowLink(Inode *h);
Inode *ReserveLink(Inode *h);
};
Inode *Test::t_CreateList(Inode *Head, int n) {
Inode *p = Head;
for (int i = 0; i < n; i++)
{
Inode *s = new Inode;
cin >> s->num;
s->next = p->next;
p->next = s;
p = s;
}
return Head;
}
void Test::ShowLink(Inode *h) {
Inode *p = h;
cout<<"单链表为:"<<endl;
while (p->next)
{
cout << p->next->num <<"-->";
p = p->next;
}
cout<<endl;
}
Inode *Test::ReserveLink(Inode *h) {
Inode *HeadNext, *HeadPre;
HeadNext = h->next->next;
HeadPre = h->next;
h->next->next = nullptr;
while (HeadNext)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == nullptr)
{
h->next = HeadPre;
}
HeadNext = tempNode;
}
return h;
}
int main() {
Test test;
Inode *Head = new Inode;
Head->next = NULL;
int num;
cout << "您想要创建几个元素的单链表?请输入:" << endl;
cin >> num;
Head = test.t_CreateList(Head, num);
test.ShowLink(Head);
Head = test.ReserveLink(Head);
test.ShowLink(Head);
return 0;
}
不含头结点
Inode *Test::ReserveLink(Inode *h) {
Inode *HeadNext, *HeadPre;
HeadNext = h->next;
HeadPre = h;
h->next = nullptr;
while (HeadNext)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == nullptr)
{
h = HeadPre;
}
HeadNext = tempNode;
}
return h;
}