您的位置:首页 > 其它

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: