1.题目:牛客网NC78(反转链表)
描述
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入:{
1,2,3}
返回值:{
3,2,1}
2.就地逆转法反转链表
只需要两个指针beg和end,解题思路参考单链表反转详解(4种算法实现)
本文是对单链表反转详解(4种算法实现)中提到的“就地扭转法”的详细扩充。
具体步骤,见笔者画的示意图(字迹稍潦草,不印象理解内容)
就地逆置法则是直接对原链表做修改,从而实现将原链表反转。
步骤详解(看图食用更佳)
第一步:申请两个指针beg和end(开始和结束),令beg指向第一个结点,另end指向beg的下一个结点:
beg=phead ;//(phead为链表表头)
end=beg->next;
第二步:断开1和2的连接,把1指向3即可
beg->next=end->next;
第三步:建立2和1的连接:把2指向1
beg->next=end->next;
第四步:把表头指针从1转移到2
head=end;
第五步:断开2和3的连接
end=beg->next
此时反转后的结果如图所示。2->1->3,继续上述操作,把3反转到2的前面去。
核心代码:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* beg = NULL;
ListNode* end = NULL;
if(pHead == NULL || pHead->next == NULL)//空链或单节点直接返回头指针
return pHead;
beg = pHead;
end = beg->next;
while(end != NULL){
beg->next = end->next;
end->next = pHead;
pHead = end;
end = beg->next;
}
return pHead;
}
};