看到不错的文章,记录一下:
https://www.cnblogs.com/mwl523/p/10749144.html
链表的就地反转:
- 思路
把当前链表的下一个节点pCur插入到头结点dummy的下一个节点中,就地反转。
dummy->1->2->3->4->5的就地反转过程: dummy->2->1->3->4->5 dummy->3->2->1->4->5
dummy->4>-3->2->1->5 dummy->5->4->3->2->1
- 解释
2.1 初始状态
- 过程
pCur是需要反转的节点。
- prev连接下一次需要反转的节点
- 反转节点pCur
- 纠正头结点dummy的指向
- pCur指向下一次要反转的节点
伪代码
1 prev.next = pCur.next;
2 pCur.next = dummy.next;
3 dummy.next = pCur;
4 pCur = prev.next;
- 循环条件
pCur is not NULL
代码
// 1.就地反转法
public ListNode reverseList1(ListNode* head) {
if (head == NULL)
return head;
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode *prev = dummy->next;
ListNode *pCur = prev->next;
while (pCur != NULL) {
prev->next = pCur->next;
pCur->next = dummy->next;
dummy->next = pCur;
pCur = prev->next;
}
return dummy->next;
}
- 总结
1个头结点,2个指针,4行代码
注意初始状态和结束状态,体会中间的图解过程。