版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15020543/article/details/84591295
带头结点
先去看一下单链表的倒置:https://blog.csdn.net/qq_15020543/article/details/84590642
对于单循环链表,它与单链表区别是,它的最后一个结点将指向头结点(无头结点将指向第一个结点),构成一个循环.
遍历循环链表的时候,结束标志是next指向head
理解了这些基础概念,单循环链表的倒置也不难了
完整函数
Inode *Test::ReserveLink(Inode *h) {
Inode *HeadNext, *HeadPre, *firstNode;
HeadNext = h->next->next;
HeadPre = h->next;
firstNode = h->next;//保存第一个结点的引用
while (HeadNext != h)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == h)
{
h->next = HeadPre;
}
HeadNext = tempNode;
}
//将最初的第一个结点,指向现在的头结点
firstNode->next = h;
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 != h)
{
cout << p->next->num << "-->";
p = p->next;
}
cout << endl;
}
Inode *Test::ReserveLink(Inode *h) {
Inode *HeadNext, *HeadPre, *firstNode;
HeadNext = h->next->next;
HeadPre = h->next;
firstNode = h->next;//保存第一个结点的引用
while (HeadNext != h)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == h)
{
h->next = HeadPre;
}
HeadNext = tempNode;
}
//将最初的第一个结点,指向现在的头结点
firstNode->next = h;
return h;
}
int main() {
Test test;
Inode *Head = new Inode;
Head->next = Head;
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, *firstNode;
HeadNext = h->next;
HeadPre = h;
firstNode = h;//保存第一个结点的引用
while (HeadNext != h)
{
Inode *tempNode = HeadNext->next;
HeadNext->next = HeadPre;
HeadPre = HeadNext;
if (tempNode == h)
{
h = HeadPre;
}
HeadNext = tempNode;
}
//将最初的第一个结点,指向现在的头结点
firstNode->next = h;
return h;
}