算法.链表反转
来源:互联网 发布:linux 自动化测试 编辑:程序博客网 时间:2024/06/05 10:14
链表反转的思路:
lrs.h:
/************************************************************************* > File Name: lrs.h > Author: zhoulin > Mail: 715169549@qq.com > Created Time: Sun 17 Apr 2016 01:08:11 PM CST ************************************************************************/#ifndef _LRS_H#define _LRS_Htypedef struct _listNode{ int v; struct _listNode *next;}listNode;//reverse a list node start with start,end whith end postionlistNode *listReverse(listNode *p,int start,int end);#endif
lrs.c:
/************************************************************************* > File Name: lrs.c > Author: zhoulin > Mail: 715169549@qq.com > Created Time: Sun 17 Apr 2016 01:09:37 PM CST ************************************************************************/#include "lrs.h"#include <stdio.h>void listPrt(listNode *p){ while(p != NULL) { if(p->next == NULL) { fprintf(stdout,"%d\n",p->v); break; } fprintf(stdout,"%d ->",p->v); p = p->next; }}/* *采用分治法 * 1.拆分链为2个链表,t_head保存目标链表的头节点,t_tail保存目标链表的最后一个节点 * 2.cur遍历到t_tail的下一个节点,n_head为t_tail下一个节点开始的新链表,采用头插法把cur节点插入到新链表,依次循环 * 3.t_tail的下一个节点为新链表的头节点,t_tail->next = n_head;最后把n_tail指向cur遍历的剩余节点。 */listNode *listReverse(listNode *p,int start,int end){ if(start >= end) { return p; } listNode *t_head,*t_tail;//target_head为目标链表第一节点,target_cur为目标链表的最后一个节点 listNode *cur,*n_head,*n_tail;//cur为遍历p的游标节点 cur = n_head = n_tail =NULL; t_head = t_tail = NULL; int i = 1; for(;i <start;i++) { if(i == 1) { t_head = p; } if(i == start -1) { t_tail = p; } p = p->next;//find list head next node } cur = p; for(;(i <= end)&& (cur != NULL);i++) { listNode *pn = cur->next; if(n_head == NULL) { n_head = n_tail = cur; }else{ cur->next = n_head; n_head = cur; } cur = pn; } if(t_head == NULL) { t_head = n_head; t_tail = n_tail; }else{ t_tail->next = n_head; } if(n_tail != NULL) n_tail->next = cur; return t_head;}int main(void){ int i,j; for(i = 6;i>=1;i--) { for(j=1;j<=i;j++) { if(j>=i) { continue; } listNode a1,a2,a3,a4,a5,a6; a1.v =1; a2.v =2; a3.v =3; a4.v =4; a5.v =5; a6.v =6; a1.next = &a2; a2.next = &a3; a3.next = &a4; a4.next = &a5; a5.next = &a6; a6.next = NULL; listNode *tmp = &a1; fprintf(stdout,"------------------------source list----------------------------\n"); listPrt(tmp); fprintf(stdout,"------------------------listReverse(%d,%d)---------------------\n",j,i); listNode *rs = listReverse(tmp,j,i); if(rs != NULL) listPrt(rs); fprintf(stdout,"\n"); } } return 0;}
运行结果:
root@:/data/code/cwork/demo:./lrs------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(1,6)---------------------6 ->5 ->4 ->3 ->2 ->1------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(2,6)---------------------1 ->6 ->5 ->4 ->3 ->2------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(3,6)---------------------1 ->2 ->6 ->5 ->4 ->3------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(4,6)---------------------1 ->2 ->3 ->6 ->5 ->4------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(5,6)---------------------1 ->2 ->3 ->4 ->6 ->5------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(1,5)---------------------5 ->4 ->3 ->2 ->1 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(2,5)---------------------1 ->5 ->4 ->3 ->2 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(3,5)---------------------1 ->2 ->5 ->4 ->3 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(4,5)---------------------1 ->2 ->3 ->5 ->4 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(1,4)---------------------4 ->3 ->2 ->1 ->5 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(2,4)---------------------1 ->4 ->3 ->2 ->5 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(3,4)---------------------1 ->2 ->4 ->3 ->5 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(1,3)---------------------3 ->2 ->1 ->4 ->5 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(2,3)---------------------1 ->3 ->2 ->4 ->5 ->6------------------------source list----------------------------1 ->2 ->3 ->4 ->5 ->6------------------------listReverse(1,2)---------------------2 ->1 ->3 ->4 ->5 ->6
0 0
- 算法.链表反转
- 链表反转算法
- [算法学习]反转链表
- 算法之反转链表
- 算法之链表反转
- 算法题目-反转链表
- 算法学习----反转链表
- 算法题目---反转链表
- 算法-链表反转操作
- 算法题--反转链表
- 算法题/反转链表
- 反转一个链表。循环算法
- 反转一个链表。递归算法
- 反转一个链表。递归算法
- 反转一个链表。递归算法
- hunter学算法-链表的反转
- 面试算法(十五)反转链表
- 反转一个链表。递归算法
- 代码模版
- C实现heap堆排序
- RxJava学习(十一)
- 快速排序/堆排序
- 算法.List链表加法
- 算法.链表反转
- 利用ViewDragHelper移动组件
- 算法.给定数为数组中2个元素的之和,求出数组的下标
- 与学府资深专家一对一电话交流
- perl 操作redis 数据库 带用户名和密码验证,选择数据库0.1.2
- 快速排序VS堆排序
- InnoDB MVCC浅谈
- list的常见操作以及算法的时间复杂度
- ARM的工作模式