剑指offer24题-翻转链表

剑指offer24题-翻转链表

题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

题目分析

  1. 在尝试翻转的过程中,发现当反转当前节点到前置节点操作进行时,如不加任何操作,会出现断链的效果,即当前节点的后置节点需要用临时变量进行保存。
  2. 在虚线的下一行,表示了每一次的翻转循环,指针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即为新链表的头结点                    
    }
};

猜你喜欢

转载自blog.csdn.net/Aaaha_jasper/article/details/118630399