数据结构——反转单链表

近期看了《剑指offer》这本书。遇到了一个问题:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。
链表结点定义例如以下:

struct ListNode
{
    int _data;
    ListNode * _pNext;
};

解决方式例如以下:

ListNode * ReverseList(ListNode * pHead)
{

    ListNode * pRevesedHead = nullptr;//反转后的头结点
    ListNode * pNode = pHead;//当前结点
    ListNode * pPrev = nullptr;//前一结点
    while (pNode != nullptr)//推断非空
    {
        ListNode * pNext = pNode->_pNext;//下一结点(用pNext保存,避免链表断裂)
        if (pNext == nullptr)//假设仅仅有一个结点
        {
            pRevesedHead = pNode;//则直接返回当前结点
        }
        pNode->_pNext = pPrev;//反转操作
        pPrev = pNode;//将前一结点指针后移到当前结点位置
        pNode = pNext;//将当前结点指针后移到下一结点位置
    }
    return pRevesedHead;//返回 反转后的头结点
}

假设不绘图。我是怎么都想不出来的。脑子都晕了~~~
后面看别人的博客,再结合自己画的图,勉强了解了反转链表的算法思想。

话不多说,以下看我的图解:

这里写图片描写叙述

这个题目还有要注意的是:

  • 推断输入的链表是否为空
  • 注意防止反转后链表出现断裂
  • 返回的反转之后的头结点不是原始链表的尾结点

以下是我的測试代码:

//创建一个新链表
void CreateList(ListNode * L,int n)
{
    cin>>L->_data;//输入第一个结点的数据值
    n--;
    for (int i = 0; i < n; i++)
    {
        ListNode * p = new ListNode;
        cin>>p->_data;
        p->_pNext = nullptr;
        L->_pNext = p;
        L = p;
    }
}

//显示链表
void showList(ListNode * L)
{
    ListNode * p = L;
    while (p)
    {
        cout<<p->_data<<' ';
        p = p->_pNext;
    }
    cout<<endl;
}

//主函数
int main()
{
    ListNode * L = new ListNode;
    L->_pNext = nullptr;
    CreateList(L,5);
    showList(L);
    ListNode * p;
    p = ReverseList(L);
    showList(p);
    return 0;
}

測试结果例如以下:

这里写图片描写叙述

就说这么多。如有不足之处。还请指教。

原文地址:https://www.cnblogs.com/zsychanpin/p/7121908.html