码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构——反转单链表

时间:2015-06-05 22:39:32      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:链表   反转   数据结构   思杰   

最近看了《剑指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;
}

测试结果如下:

技术分享

就说这么多,如有不足之处,还请不吝赐教。

数据结构——反转单链表

标签:链表   反转   数据结构   思杰   

原文地址:http://blog.csdn.net/u013271921/article/details/46382345

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!