Reverse Linked List和Reverse Linked List II

本文详细介绍了如何通过递归函数实现链表的完全逆置和部分逆置,提供了两种不同的代码实现方式,并针对每种情况给出了具体的实现步骤。

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

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;

转载于:https://www.cnblogs.com/xdlyy/p/5391189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值