反转链表
反转链表
http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca
思路分析:
- 正向链表,只能访问当前结点的下一个结点,无法访问上一个结点。要反转,因此需要一个指针保存上一个结点。
- 调整当前结点的next指针指向上一个结点后,链表断开,无法访问到下一个结点,因此在反转指针之前,需要一个指针保存当前结点的下一个结点。
- 当然,当前结点也是需要一个指针来索引,因此本题需要设置三个指针。(或者把传入的头结点当作当前结点)
code
//迭代
ListNode* ReverseList(ListNode* pHead)
{
if (!pHead)
return nullptr;
ListNode* curNode=pHead;//当前结点
ListNode* preNode = nullptr;//前一个结点
ListNode* nextNode = nullptr;
while (curNode)
{
nextNode = curNode->m_pNextNode;//保存下一个结点
curNode->m_pNextNode = preNode;// 让当前节点指向前一个节点位置,反转
preNode = curNode;//更新指针
curNode = nextNode;// 当前节点往右继续走
}
return preNode;//注意是输出preNode,因为curNode指向了nullptr
}
//递归
ListNode* ReverseList_digui(ListNode* cur, ListNode* pre)
{
if (!cur)
return pre;//结束条件
ListNode* next = cur->m_pNextNode;
cur->m_pNextNode = pre;
pre = cur;
cur = next;
return ReverseList_digui(cur, pre);
}
ListNode* ReverseList1(ListNode* pHead)
{
if (!pHead)
return nullptr;
ListNode* cur = pHead;
ListNode* pre = nullptr;
return ReverseList_digui(cur, pre);
}
CVTE公司福利 672人发布