【剑指offer】反转链表,C++实现(链表)
1.题目
- 输入一个链表的头结点,首先反转链表后,然后输出链表的所有元素(牛客网)。
struct ListNode { int val; struct ListNode *next; };
2.思路
# 反转链表
辅助指针:定义三个用于翻转链表的辅助指针和一个用于表示翻转链表头结点的指针,node指向当前节点、left指向当前节点的前一个节点、right指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点。
翻转链表过程:循环翻转链表,每次循环翻转一个结点。判断node是否是最后一个结点,如果是最后一个节点,则reverseHead指向node(确定翻转链表表头节点),然后node指向left(翻转链表),退出循环;如果不是最后一个节点,则node指向left(翻转链表),移动left和node指针。
# 鲁棒性
- 空链表
- 有一个节点的链表
- 有多个节点的链表
3.code
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* ReverseList(ListNode* pHead) 12 { 13 // 反转指针 14 ListNode* pNode=pHead; // 当前节点 15 ListNode* pPrev=nullptr;// 当前节点的上一个节点 16 ListNode* pNext=nullptr;// 当前节点的下一个节点 17 ListNode* pReverseHead=nullptr;//新链表的头指针 18 19 // 反转链表 20 while(pNode!=nullptr) 21 { 22 pNext=pNode->next; // 建立链接 23 24 if(pNext==NULL) // 判断pNode是否是最后一个节点 25 pReverseHead=pNode; 26 27 pNode->next=pPrev; // 指针反转 28 pPrev=pNode; 29 pNode=pNext; 30 } 31 return pReverseHead; 32 } 33 };