单向循环链表就地逆置

来源:互联网 发布:深圳市咫尺网络 编辑:程序博客网 时间:2024/05/01 19:06

原来自己想过一个思路,后来发现完全是不正确的。

看来最后还是得在网上查找算法,最后才实现了。

        (1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
  (2)当链表含2个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中。这样就可以得到逆置的链表

具体实现起来就不是那么困难了,在纸上面画画就出来了~~~

#include <iostream>#include <malloc.h>#define OK    1#define ERROR 0#define LENGTH 10typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;struct LNode* next;}LNode, *LinkList;//创建链表Status CreateList(LinkList &L){LinkList s = NULL;int i = 0;L = (LinkList)malloc(sizeof(LNode) * LENGTH);L->next = NULL;L->data = 0;for (i = 1; i <= LENGTH; i++){s = (LinkList)malloc(sizeof(LNode));s->data = 10 - i + 1;s->next = L->next;L->next = s;}return OK;}//链表逆置Status InverseList(LinkList &L){LinkList p = NULL;LinkList q = NULL;//传入的L是头节点if (L && L->next )//保证至少含有两个节点以上{//创建两个临时变量p = L->next;q = p->next;p->next = NULL;}//将除了头节点和第一个节点之外的多余节点遍历并将每个节点摘出来放到头节点的后面while (q){p = q;q = q->next;p->next = L->next;L->next = p;}return OK;}//打印链表Status PrintfList(LinkList L){int i = 0;if (L == NULL)std::cout<<"该链表是空表"<<std::endl;while(L->next != NULL){std::cout<<"第"<<i<<"个节点的数值:"<<L->data<<std::endl;L = L->next;i++;}std::cout<<"第"<<i<<"个节点的数值:"<<L->data<<std::endl;std::cout<<std::endl;return OK;}//删除链表Status DeleteList(LinkList &L){LinkList p = NULL;while (L->next){p = L->next;L->next = p->next;free(p);}return OK;}int main(){LinkList L = NULL;//创建链表,长度为10个长度CreateList(L);//打印链表PrintfList(L);//链表逆置InverseList(L);//重新打印链表PrintfList(L);//删除链表DeleteList(L);//删除链表之后打印链表PrintfList(L);return 0;}

原创粉丝点击