码迷,mamicode.com
首页 > 其他好文 > 详细

Reverse Linked List和Reverse Linked List II

时间:2016-04-14 15:41:20      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

当完全逆置链表时,只用配置好标头,并在另写递归函数逆置链表即可并由主函数调用,程序如下:

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;

Reverse Linked List和Reverse Linked List II

标签:

原文地址:http://www.cnblogs.com/xdlyy/p/5391189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!