数据结构——反转单链表
2015-06-05 22:17
423 查看
最近看了《剑指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; }
测试结果如下:
就说这么多,如有不足之处,还请不吝赐教。
相关文章推荐
- 数据结构和算法-003 数组排序 选择排序
- java内置数据结构--Map接口与特性
- 常见算法题:判断表达式括号是否匹配
- 树状数组区间求和三种模型
- 高性能mysql笔记---schema与数据结构[-3-]
- 7. C#数据结构与算法 -- 存储结构(单链表)
- C# 数据结构 线性表(顺序表 链表 IList 数组)
- 数据结构- 堆
- JAVA数据结构系列 栈
- 数据结构笔记三
- 数据结构与算法分析-散列(hashing)
- 数据结构与算法分析-优先队列 堆(heap)
- ZH奶酪:【数据结构与算法】并查集基础
- 数据结构算法代码实现——静态单链表(四)
- 数据结构之---C语言实现共享栈
- 6. C#数据结构与算法 -- 非线性结构(图)
- 数据结构和算法-002 数组排序 冒泡排序
- 数据结构之静态循环队列(所有操作)
- 数据结构系列之归并排序
- 数据结构和算法-001 数组