您的位置:首页 > 健康 > 美食 > 链表反转算法

链表反转算法

2024/12/24 11:18:58 来源:https://blog.csdn.net/fengchengwu2012/article/details/141289015  浏览:    关键词:链表反转算法

        链表的反转有较多的方法,如原地算法,迭代法、头插法、递归法,本文使用递归法和迭代法两种方式进行演示。

一、定义链表

typedef  struct   SinglyLinkNode
{/**后继节点 */struct  SinglyLinkNode* next;/** 节点数据域 */int  data;
} LinkNode;/**** 添加链表元素
*/
void  insert_link_node(LinkNode**  link,int data);/*** 查询链表
*/
void  show_link_list(LinkNode* head);/***递归法 链表反转
*/
LinkNode*  recursion_reversal(LinkNode*  head);/*** 迭代法 链表反转
*/
LinkNode*  iteration_reversal(LinkNode*  head);

二、链表操作

/**** 添加链表元素*/
void insert_link_node(LinkNode** link, int data)
{LinkNode* head=  *link;if (head == NULL){head = malloc(sizeof(LinkNode*));head->data = data;head->next = NULL;(*link) = head;return;}LinkNode* newNode = malloc(sizeof(LinkNode*));newNode->next = NULL;newNode->data = data;while (head!=NULL && head->next!=NULL ){head = head->next;}head->next = newNode;
}/*** 查询链表*/
void show_link_list(LinkNode *head)
{if (head == NULL){return;}printf("\n----\t");LinkNode *next = head;while (next != NULL){printf("%d\t", next->data);next = next->next;}printf("\n------------------------------------\n");
}

三、递归法

LinkNode* recursion_reversal(LinkNode* head)
{if ( head ==NULL || head->next == NULL){return head;}LinkNode* newNode = recursion_reversal(head->next);head->next->next = head;head->next = NULL;return newNode;
}
int main()
{int  arr[] = { 88, 77, 66, 55 , 44, 33 , 22 ,11};LinkNode* head = NULL;int i = 0;for( i ; i < sizeof(arr)/sizeof(int) ; i++ ){insert_link_node(&head,arr[i]);}show_link_list(head);head = recursion_reversal(head);show_link_list(head);while (1) {}exit(0);
}

四、迭代法

/*** 迭代法反转链表
*/
LinkNode*  iteration_reversal(LinkNode*  head)
{if(head==NULL ||  head->next==NULL){return head;}/// 存储当前节点LinkNode* cur = head;/// 存储临时存储前继节点LinkNode* pre = NULL;/// 临时存储当前后继节点LinkNode* next = NULL;while (cur->next!=NULL){next =  cur->next;cur->next = cur->next->next;if(pre == NULL){pre = next;pre->next = cur;head =  pre;}else{LinkNode* tmp =  head;next->next =  tmp;head =  next;}}return head;
}
int main()
{int  arr[] = { 88, 77, 66, 55 , 44, 33 , 22 ,11};LinkNode* head = NULL;int i = 0;for( i ; i < sizeof(arr)/sizeof(int) ; i++ ){insert_link_node(&head,arr[i]);}show_link_list(head);head = iteration_reversal(head);show_link_list(head);while (1) {}///getchar()exit(0);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com