1.带头结点实现
#include
#include
typedef struct node{
int data;
struct node *next;
}LinkNode,*LinkList;
void reverseonewaycircularlinkedlist(LinkList head)
{
LinkList p,q,r;
p = head->next;//带头结点的单循环链表好处就在于,每次插入都是放在首元素之前。
while(p->next != head)//判断循环结束的条件必须是当前节点的下一个的下一个是不是head
{
//先断待逆置的元素 q
q = p->next;
p->next = q->next;
//再插入到链表首元素之前
q->next = head->next;
head->next = q;
}
//p->next = head;没有必要
p =head;
while(p->next != head)
{
p = p->next;
printf("final%d ",p->data);
}
}
LinkList createonewaycircularlinkedlist(int a[], int n)//头插法建立带头结点的单循环链表
{
LinkList head,p,q;
int i = 0;
head = (LinkList) malloc(sizeof(LinkNode));
head->next = head;
p = head;
if(n > 0)
{
while(i < n)
{
q = (LinkList) malloc (sizeof(LinkNode));
q->data = a[i++];
q->next = p;
p->next = q;
p = p->next;
}
}
p->next = head;//非常重要。否则,头指针没有前驱,构不成单循环链表。
p = head->next ;
while(p != head)
{
printf("ininal%d ",p->data);
p = p->next;
}
return head;
}
int main()
{
int a[5] = {1,2,3,4,5};
LinkList head;
head = createonewaycircularlinkedlist(a,5);
reverseonewaycircularlinkedlist(head);
return 0;
}
2.不带头结点实现
#include
#include
typedef struct node{
int data;
struct node *next;
}LinkNode,*LinkList;
void reverseonewaycircularlinkedlist(LinkList head)
{
LinkList p,q,r;
r =p = head;
while(p->next->next != r)//必须有一个r节点保存最初的头结点。因为最初的尾节点的下一个指针指向这个最初的头结点,如果不保存这个最初的头结点后面的互换会找不到循环的出口。
{
//先断待逆置的元素 q
q = p->next;
p->next = q->next;
//再插入到链表首元素之前 。相当于把q与头结点互换
q->next = head;
head = q;//每次更改当前头结点为q
}
q = p->next;
q->next = head;
head = q;
p->next = head;
p =head;
while(p->next != head)
{
printf("final%d ",p->data);
p = p->next;
}
printf("final%d ",p->data);
}
LinkList createonewaycircularlinkedlist(int a[], int n)//尾插法生成不带头结点的单循环链表
{
LinkList head,p,q;
int i = 0;
head = (LinkList) malloc(sizeof(LinkNode));
head->next = head;
p = head;
if(n > 0)
{
while(i < (n-1))
{
p->data = a[i++];//给上次生成的节点赋值
q = (LinkList) malloc (sizeof(LinkNode));
p->next = q;
p = p->next;
}
}
p->data = a[i];//给最后那个生成的节点赋值
p->next = head;//非常重要。否则,头指针没有前驱,构不成单循环链表。
p = head ;
while(p->next != head)
{
printf("ininal%d ",p->data);
p = p->next;
}
printf("ininal%d ",p->data);
return head;
}
int main()
{
int a[5] = {1,2,3,4,5};
LinkList head;
head = createonewaycircularlinkedlist(a,5);
reverseonewaycircularlinkedlist(head);
return 0;
}