Reorder List
2015-06-11 14:39
417 查看
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given
把后面的部分插入前面。
中心思想,将链表重中间断开,然后把后面的链表部分倒序,之后把后面链表的头节点依次插入到head链表里面。
其代码如下。
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given
{1,2,3,4}, reorder it to
{1,4,2,3}.
把后面的部分插入前面。
中心思想,将链表重中间断开,然后把后面的链表部分倒序,之后把后面链表的头节点依次插入到head链表里面。
其代码如下。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head); int LengthList(struct ListNode* head); void reorderList(struct ListNode* head) { if(head==NULL||head->next==NULL) return ; int mid; int length; struct ListNode* pCurrent=head; length=LengthList(pCurrent); mid=(length+1)/2; //3 应该是第2个,以后也是在后面一个 //找到中间节点,分成两条链表,//mid 后面哪一个开始 struct ListNode* pCurrentmid=head; struct ListNode* pCurrentmidFront; while(mid--) { pCurrentmidFront=pCurrentmid; pCurrentmid=pCurrentmid->next; //mid=1,最后一个设置为null } struct ListNode* pCurrentMidafter=pCurrentmid; //3--->1 pCurrentmidFront->next=NULL; //让他变成两个链表 //翻转pCurrentMidafter pCurrentMidafter=reverseList(pCurrentMidafter); //DisplayList(pCurrentMidafter); //DisplayList(head); // //将翻转后的链表插入到head链表中.. pCurrent=head; while(pCurrent!=NULL&&pCurrentMidafter!=NULL) { pCurrentmidFront=pCurrentMidafter; pCurrentMidafter=pCurrentMidafter->next; //插入 pCurrentmidFront->next=pCurrent->next; pCurrent->next=pCurrentmidFront; //放回原位 pCurrent=pCurrentmidFront->next; } } int LengthList(struct ListNode* head) { if(head==NULL) return 0; int length=0; struct ListNode* pCurrent=head; while(pCurrent!=NULL) { length++; pCurrent=pCurrent->next; } //free(pCurrent); return length; } struct ListNode* reverseList(struct ListNode* head) { struct ListNode* newhead; newhead=NULL; //这样就不需要翻转了 if (head==NULL||head->next==NULL) { return head; } struct ListNode* pCurrent=head; //一样的点 while(pCurrent!=NULL) { struct ListNode* tmp=pCurrent; pCurrent=pCurrent->next; tmp->next=newhead; //把节点放在节点前面,插入到链表的最前端 newhead=tmp; } return newhead; }
相关文章推荐
- 对象中间件--CORBA开发练习
- sql面试题(学生表_课程表_成绩表_教师表)
- C++ 10.3.7 从map对象中删除元素
- ubuntu LAMP的安装
- Solr特性:Schemaless Mode(自动往Schema中添加field)
- android 布局总结
- 轻松自动化---selenium-webdriver(python) (一)
- java.lang.NoClassDefFoundError:org/bouncycastle/jce/provider/BouncyCastl
- 调用支付宝SDK问题
- Apache Shiro 使用手册(二)Shiro 认证
- 一个数值计算中通常很有用的数值的定义和计算
- 在较低版本上面使用Material Design风格
- selenium 中定位及打开浏览器操作代码
- Ubuntu Server 下的网络配置
- UIImageview 通过 UITapGestureRecognizer添加点击事件
- GRE机考阅读流程
- FlexiGrid使用手册
- Make.am中生成.la动态库的同时要链接.a静态库的问题
- web.xml被文件加载过程,各节点加载顺序总结
- oracle递归数结构数据