(1)问题
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
(2)思路
第一种:重新定义个链表,然后将反转链表存储到新链表中。(缺点:消耗额外的内存空间)
第二种:在原链表中修改节点的指针指向,采用双指针法来实现。(本题采用的这种方法)
(3)解题流程
1.判断头节点是否为空,如果为空直接返回nullptr。
2.定义两个节点pre=nullptr和cur = head和一个temp节点。
3.进入循环,终止条件是cur!=nullptr。用temp节点存储cur->next。然后将cur->next = pre。两个节点的方向已经发生反转。
4.移动pre节点和cur节点。pre = cur,cur = temp;
5.结束循环,返回pre节点。
代码实现:
ListNode* reverseList(ListNode* head) {
if(head==nullptr) return nullptr;
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode* temp;
while(cur!=nullptr)
{
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
主要难点就是两个节点的反转以及双指针的移动。