【剑指offer】16 - 反转链表

题目描述
  • 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转链表后链表的头节点。链表的节点定义如下:
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
解题思路
  • 反转链表,即改变原链表的指向,让其指向相反的方向,原来的链表头做新链表的尾,原来的尾做新链表的头
  • 如下图所示:
    反转链表
  • 假设我们已经将 a、b 节点反转,那么我们下一步要做的就是将 c 节点链在 b 节点的后面,为了不让后面的链表丢失,我们需要在设置一个 next 节点来将 c 节点的下一个节点保存起来,而且我们还要知道 b 节点,即反转链表当前操作节点的前一个节点,这样才可以将 c 节点链上去而节点不丢失
  • 所以,整理上面所述,我们在反转过程中总共需要三个指针,一个表示当前节点的 cur,一个表示当前节点的下一个节点 next(原链表中cur的next),一个表示当前操作节点的前一个节点 prev(新链表中cur 的prev,原链表中cur 的next)。
  • 那么我们整个反转链表的调整过程是:
    • 若当前节点的下一个节点为空,那么当前节点就是尾节点
    • 否则,我们就将当前的指针进行迭代,直至当前节点为空为止
  • 理清楚思路后,代码写起来就很简单了
代码实现
ListNode* ReverseList(ListNode* pHead)
{
    if(pHead == NULL)
        return pHead;
    ListNode* newList = NULL;
    ListNode* cur = pHead;
    ListNode* prev = NULL;
    ListNode* next = NULL;

    while(cur != NULL)
    {
        //记录当前节点在原链表上的下一个节点
        next = cur->next;
        //若当前节点的下一个节点为空,则说明当前节点为尾节点,即新链表的头结点
        if(next == NULL)
            newHead = cur;



        cur->next = prev;
        //指针进行迭代
        prev = cur;
        cur = next;
    }
}

猜你喜欢

转载自blog.csdn.net/Aurora_pole/article/details/81530759