题目描述
- 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转链表后链表的头节点。链表的节点定义如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
解题思路
- 反转链表,即改变原链表的指向,让其指向相反的方向,原来的链表头做新链表的尾,原来的尾做新链表的头
- 如下图所示:
- 假设我们已经将 a、b 节点反转,那么我们下一步要做的就是将 c 节点链在 b 节点的后面,为了不让后面的链表丢失,我们需要在设置一个 next 节点来将 c 节点的下一个节点保存起来,而且我们还要知道 b 节点,即反转链表当前操作节点的前一个节点,这样才可以将 c 节点链上去而节点不丢失
- 所以,整理上面所述,我们在反转过程中总共需要三个指针,一个表示当前节点的 cur,一个表示当前节点的下一个节点 next(原链表中cur的next),一个表示当前操作节点的前一个节点 prev(新链表中cur 的prev,原链表中cur 的next)。
- 那么我们整个反转链表的调整过程是:
- 若当前节点的下一个节点为空,那么当前节点就是尾节点
- 否则,我们就将当前的指针进行迭代,直至当前节点为空为止
- 理清楚思路后,代码写起来就很简单了
代码实现
ListNode* ReverseList(ListNode* pHead)
{
if(pHead == NULL)
return pHead;
ListNode* newList = NULL;
ListNode* cur = pHead;
ListNode* prev = NULL;
ListNode* next = NULL;
while(cur != NULL)
{
//记录当前节点在原链表上的下一个节点
next = cur->next;
//若当前节点的下一个节点为空,则说明当前节点为尾节点,即新链表的头结点
if(next == NULL)
newHead = cur;
cur->next = prev;
//指针进行迭代
prev = cur;
cur = next;
}
}