一、问题描述:
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
二、问题思考:
-
方法一:三指针
遍历以cur->next为基准,
当cur->next为空退出循环,
最后链表处于如上图一样的状态,做收尾处理,
将cur->next指向pre,
head->next = NULL(head记录第一个pre指针所在的位置,将第一个pre与cur的指针删除掉),
随后以当前结点作为新的头结点,完成链表的反转,代码如下:
ListNode* reverseList(struct ListNode* head){
if(head == NULL || head->next == NULL)
return head;
struct ListNode* pre,*cur,*next;
pre = head;
cur = head->next;
while(cur->next){
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
cur->next = pre;
head->next = NULL;
head = cur;
return head;
}
-
方法二:双指针
类似于链表的头插法,不需要考虑边界情况
ListNode* ReverseList(ListNode* pHead) {
if(!pHead || !(pHead->next)) return pHead;
ListNode* pre = nullptr;
ListNode* cur = nullptr;
while(pHead!=nullptr){
cur = pHead->next;
pHead->next = pre;
pre = pHead;
pHead = cur;
}
return pre;
}