剑指offer24题-翻转链表
题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
题目分析
- 在尝试翻转的过程中,发现当反转当前节点到前置节点操作进行时,如不加任何操作,会出现断链的效果,即当前节点的后置节点需要用临时变量进行保存。
- 在虚线的下一行,表示了每一次的翻转循环,指针pre,cur,temp相对位置关系。cur为当前节点(待翻转的节点)可以看出,每次循环前需记住当前节点的后置节点temp,还有前驱结点pre,反转的核心就是cur->next = pre。
// 单链表的定义
struct ListNode{
int val; //节点值
ListNode *next;//next指向下一节点
ListNode(int x):val(x),next(NULL){}
};
class Solution{
public:
ListNode * reverseList(ListNode* head){
ListNode* cur = head; //初始化cur 在head位置
ListNode* temp; //temp初始化每次都是重复的循环,放在循环中定义
ListNode* pre = nullptr; //如上图数字1节点cur->next = NULL,并且原链表中cur在第一位,pre理所当然为空指针。
while(cur){ //待翻转节点不为空时进行循环
temp = cur->next; //记录后继
cur->next = pre; //翻转操作
pre = cur; //pre向后移
cur = temp;//cur向后移
}
return pre; //此时cur为空,pre不为空。返回pre即为新链表的头结点
}
};