单链表反转问题有很多好的处理方法,做题的时候看到一种很好的解决思路。
新建三个指针分别为 pre、cur、next 。
pre作为新建链表的头指针,cur作为当前待转移元素的指针,next作为除待转移元素以为,剩余元素的头指针
三个指针设置的很合理,分别对应有效的位置,避免丢掉链表的位置。其中next是在cur不为NULL这一条件成立才会创建。
如果采用循环外创建,循环内使用 next = next -> next 这样的方式更新指针。此时next达到NULL时,cur仍然满足循环条件,此时会造成 next指针为 NULL 时没有 next指针域造成的执行错误。
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode* pre = NULL; // 作为转换后的链表的头指针
ListNode* cur = head; // 待转换的元素
while(cur != NULL) {
ListNode* next = cur->next; // 创建next指针
cur->next = pre; // 移动数,将新链表接到待移数的指针
pre = cur; // 新链表头指针右移
cur = next; // 待换数指针右移
}
return pre;
}
};