反转链表
反转链表
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); }