单链表反转问题有很多好的处理方法,做题的时候看到一种很好的解决思路。
新建三个指针分别为 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; } };