Reverse Linked List和Reverse Linked List II
2016-04-14 15:10
169 查看
当完全逆置链表时,只用配置好标头,并在另写递归函数逆置链表即可并由主函数调用,程序如下:
ListNode* reverseList(ListNode* head) {
if(head == NULL) return NULL;
ListNode* p=head;
while(p->next!=NULL) p=p->next;
doReverse(head);
return p;
}
ListNode* doReverse(ListNode* head) {
if(head->next==NULL) return head;
ListNode* p=doReverse(head->next);
p->next = head;
head->next = NULL;
return head;
}
当部分逆置链表时,根据不同情况,修改主函数应对不同情况即可:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(head == NULL) return NULL;
if(m==n) return head;
ListNode* p1=head;
for(int i=m; i>2; i--) {
p1 = p1->next;
}
ListNode* q=head;
for(int i=n; i>1; i--) {
q = q->next;
}
if(m==1) {
if(q->next==NULL) {
doReverse(head);
return q;
}
ListNode* q1=q->next;
q->next = NULL;
doReverse(head);
head->next = q1;
return q;
}
else {
if(q->next == NULL) {
ListNode* p=p1->next;
doReverse(p);
p1->next = q;
return head;
}
ListNode* p = p1->next;
ListNode* q1 = q->next;
q->next = NULL;
doReverse(p);
p1->next = q;
p->next = q1;
return head;
}
}
还有比较短的代码实现方法,但我是借鉴别人的,执行速度是差不多的:
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode *leftI = dummy;
for(; --m; --n) leftI = leftI->next;
ListNode *cur = leftI->next, *rtail = cur, *pre = nullptr;
while(n--){
ListNode* nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
rtail->next = cur; leftI->next = pre;
return dummy->next;
ListNode* reverseList(ListNode* head) {
if(head == NULL) return NULL;
ListNode* p=head;
while(p->next!=NULL) p=p->next;
doReverse(head);
return p;
}
ListNode* doReverse(ListNode* head) {
if(head->next==NULL) return head;
ListNode* p=doReverse(head->next);
p->next = head;
head->next = NULL;
return head;
}
当部分逆置链表时,根据不同情况,修改主函数应对不同情况即可:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(head == NULL) return NULL;
if(m==n) return head;
ListNode* p1=head;
for(int i=m; i>2; i--) {
p1 = p1->next;
}
ListNode* q=head;
for(int i=n; i>1; i--) {
q = q->next;
}
if(m==1) {
if(q->next==NULL) {
doReverse(head);
return q;
}
ListNode* q1=q->next;
q->next = NULL;
doReverse(head);
head->next = q1;
return q;
}
else {
if(q->next == NULL) {
ListNode* p=p1->next;
doReverse(p);
p1->next = q;
return head;
}
ListNode* p = p1->next;
ListNode* q1 = q->next;
q->next = NULL;
doReverse(p);
p1->next = q;
p->next = q1;
return head;
}
}
还有比较短的代码实现方法,但我是借鉴别人的,执行速度是差不多的:
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode *leftI = dummy;
for(; --m; --n) leftI = leftI->next;
ListNode *cur = leftI->next, *rtail = cur, *pre = nullptr;
while(n--){
ListNode* nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
rtail->next = cur; leftI->next = pre;
return dummy->next;
相关文章推荐
- UIAlertView内容左对齐
- 语言切换
- 3月16日 整体管理+范围管理
- Git设置
- 使用一致性哈希实现Redis分布式部署
- 将字符串中的每一个字母变成其下一个字母
- Android 实用方法 — 截屏与截长图功能的实现
- Mac系统下开启和关闭隐藏文件的设方法
- java Reflection(反射)机制
- 内存泄漏的情况有哪些?
- Android jni 中打印logcat日志
- sharedpreference存储用户名和密码
- C++基本概念
- solr入门之lucene的索引操作之增加,删除,修改,查询及查询解析代码模板
- linux文件和目录权限
- SQL Server Merge语句的使用
- QT之ODBC操作Excel的解决方案
- 鼠标点击事件总结
- java实现Base64编码解码
- 特征值分解、奇异值分解、PCA概念整理