反转链表
来源:互联网 发布:航海王娜美工口h本子 编辑:程序博客网 时间:2024/06/05 20:51
参考《剑指Offer》
题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:
struct ListNode{ int m_nkey; ListNode* m_pNext;};
要点
1、链表的建立中由于需要改变头指针指向的值,所以要用双重指针。
2、反转的逻辑主要是让后面结点指向前面的结点,但是如果仅仅这样操作,链表就断了,无法继续向后操作。所以同时需要保存三个结点,前两个结点进行反转操作,后面一个结点用于保证链表的连续性。最主要的逻辑在代码中只是以下这一段:
ListNode* Reverse(ListNode* pHead)//链表的反转{ ListNode* pHead2=NULL; ListNode* pNode=pHead; ListNode* pPrev=NULL; while(pNode!=NULL) { ListNode* pNext=pNode->next; if(pNext==NULL) pHead2=pNode; pNode->next=pPrev; pPrev=pNode; pNode=pNext; } return pHead2;}
最终结果:
代码
#include<iostream>using namespace std;struct ListNode{ int key; ListNode* next;};void Create(ListNode** pHead)//建立链表,由于此处需要改头指针指向的值,所以要用双向链表{ int n; cin>>n; ListNode* pNode=NULL; ListNode* pPrev=NULL; int k; cin>>k; pNode=new ListNode; pNode->key=k; *pHead=pNode; pPrev=pNode; while(--n) { cin>>k; pNode=new ListNode; pNode->key=k; pPrev->next=pNode; pPrev=pNode; } pNode->next=NULL;}void Print(ListNode* pHead)//输出链表中的值{ ListNode* pNode=pHead; while(pNode!=NULL) { cout<<pNode->key<<endl; pNode=pNode->next; }}ListNode* Reverse(ListNode* pHead)//链表的反转{ ListNode* pHead2=NULL; ListNode* pNode=pHead; ListNode* pPrev=NULL; while(pNode!=NULL) { ListNode* pNext=pNode->next; if(pNext==NULL) pHead2=pNode; pNode->next=pPrev; pPrev=pNode; pNode=pNext; } return pHead2;}int main(){ ListNode* p=NULL; Create(&p); Print(p); cout<<endl; Print(Reverse(p)); return 0;}
1 0
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- 链表的反转
- websphere 跳过应用程序,只启动server
- iOS自定义控件要注意的问题
- 页面置换算法 FIFO和LRU 及各自的命中率
- Java运行系统命令行并获取返回值
- 怎么用C#获取指定窗口的句柄(笔记)
- 反转链表
- Java中如何将int 类型转换为 Long类型
- idea解决打开大文件消耗CPU问题
- IE浏览器下的存储方式——UserData
- JAVA字符串格式化-String.format()的使用
- 教你认识你的访客
- jsonarray jsonobject之间的转换
- Android 相关重难点知识整理
- SpringMVC 解读之<mvc:annotation-driven/>标签