定义两个指针: pre 和 cur ;pre在前 cur 在后。
每次让 pre 的 next 指向 cur ,实现一次局部反转
局部反转完成之后, pre 和 cur 同时往前移动一个位置
循环上述过程,直至 pre 到达链表尾部
代码如下:
ListNode* reverseList(ListNode* head) {
ListNode* cur = NULL, * pre = head;
while (pre != NULL) {
ListNode* t = pre->m_pNext;
pre->m_pNext = cur;
cur = pre;
pre = t;
}
return cur;
}
递归写法:
使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ret .
此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。
同时让当前结点的 nextt 指针指向 NULL ,从而实现从链表尾部开始的局部反转
当递归函数全部出栈后,链表反转完成。
代码如下:
ListNode* reverseList(ListNode* head) {//递归写法
if (head == NULL || head->m_pNext ==NULL) {
return head;
}
ListNode* ret= reverseList(head->m_pNext);
head->m_pNext->m_pNext = head;
head->m_pNext = NULL;
return ret;
}