续:一个带头结点的单链表反转(递归)
2012-12-12 16:21
501 查看
接着前面的循环算法(一个带头结点的单链表反转)实现的反转,再试试递归,主要是这个头结点的处理有点麻烦,不过还是解决了,不知道这样有什么缺陷?
递归的算法实现在代码的第72行开始。
递归的算法实现在代码的第72行开始。
#include<stdio.h> #include<malloc.h> typedef char ElemType; typedef struct Node{ ElemType data; struct Node *next; }SLink; void InitLink(SLink *&Head) { Head = (SLink *)malloc(sizeof(SLink)); Head->next = NULL; } int GetLength(SLink *Head) { int i=0; SLink *p = Head->next; while(NULL != p) { p = p->next; i++; } return i; } bool InsertNode(SLink *Head,int i,ElemType dt) { int j=1; SLink *p = Head; if(i<1 || i>GetLength(Head)+1) return false; SLink *newNode = (SLink *)malloc(sizeof(SLink)); newNode->next = NULL; newNode->data = dt; while(j<i) { p = p->next; j++; } newNode->next = p->next; p->next = newNode; return true; } bool Reverse(SLink *&Head) { if(NULL == Head->next) return false; SLink *pre = Head->next; if (NULL == pre->next) { return false; } SLink *cur = pre->next,*tmp; pre->next = NULL; while(NULL != cur) { tmp = cur->next; cur->next = pre; pre = cur; cur = tmp; } Head->next = pre; return true; } bool ReverseRecursion(SLink *&Head,SLink *newHead = NULL) { static bool twonodes_flag = false; static SLink *save_head = Head; SLink *cur = Head,*next; if(twonodes_flag == false) { if (NULL == Head->next || NULL == Head->next->next) { return false; } twonodes_flag = true; cur = Head->next; } next = cur->next; cur->next = newHead; newHead = cur; if(NULL != next) { return ReverseRecursion(next,newHead); } else { save_head->next = cur; return true; } } void Display(SLink *Head) { SLink *p = Head->next; while(NULL != p) { printf(" %c ",p->data); p = p->next; } printf("\n"); } int main() { SLink *L; InitLink(L); for(int i=1; i<10; i++) { InsertNode(L,i,'A'+i-1); } Display(L); Reverse(L); printf("After Reverse the link is:\n"); Display(L); ReverseRecursion(L); printf("After ReverseRecursion the link is:\n"); Display(L); return 0; }
相关文章推荐
- 一个带头结点的单链表反转
- 131. 一个链表的结点结构,合并非递归和递归
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 带头结点的单链表反转
- 建立一个带头结点的的单向链表并输出到out53.dat和屏幕上。各节点的值为对应的下表。链表的节点数及输出地文件名作为参数传入
- 单链表反转问题(带头结点 和 不带头结点的 创建链表过程等)
- 题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。
- 不带头结点的单链表删除任意一个节点
- 有一个带头结点的单链表L={a1,b1,a2,b2,...,an,bn},设计一个算法将其拆分成两个带头结点的单链表A和B,正序链表A={a1,a2,a3...,an},逆序链表B={bn,bn-1,
- 链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。 用C语言编写 用以存放输入的二进制数 建立 一个带头结点的线性链表
- 不带头结点的单链表反转 三种不同方法实现
- 对一个不带头结点的单链表进行逆置
- 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
- 反转带头结点的链表
- 反转一个链表并输出各个结点的值
- 将两个递增有序的带头结点的单链表A、B合并成为一个递增有序的带头结点的单链表
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- 基于链表:键盘输入若干个整数,按输入数据逆序建立一个带头结点的单链表
- 不带头结点的单链表递归删除元素为X的结点
- 给一个不带头结点的单链表,写出将链表倒置的算法