Problem: 206. 反转链表
解析
这个题干想很费脑子,多个指针变来变去可记不住,浪费一个小时也没调对,还是得画下图,一步一步规划代码,类似数形结合思想,这叫码形结合思想
码形结合思想
开头额外处理,剩下的节点循环处理即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public: ListNode *reverseList(ListNode *head) { if (head == nullptr) { return nullptr; }
ListNode *node = head; ListNode *pre; ListNode *nex; pre = node; if (node->next == nullptr) { return node; } node = node->next; nex = node->next; node->next = pre; pre->next = nullptr; pre = node; node = nex; while (node != nullptr) { nex = node->next; node->next = pre; pre = node; node = nex; } return pre; } };
|
简化代码
上个答案对不必要逻辑和变量的缩减
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: ListNode *reverseList(ListNode *head) {
ListNode *node = head; ListNode *pre = nullptr; ListNode *nex; pre = node; if (node->next == nullptr) { return node; } node = node->next; nex = node->next; node->next = pre; pre->next = nullptr; pre = node; node = nex; while (node != nullptr) { nex = node->next; node->next = pre; pre = node; node = nex; } return pre; } };
|
第一次做的错误答案
错误答案,第一遍给看成循环移动链表的了,好好审题,浪费时间了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: ListNode *reverseList(ListNode *head) { if (head == nullptr) { return nullptr; }
ListNode *node1 = head;
ListNode *tail = head; while (tail->next != nullptr) { tail = tail->next; } ListNode *node2 = tail;
while (node1->next != tail) { node2->next = node1; node2 = node2->next; node1 = node1->next; } node2->next = node1; node1->next = nullptr;
return tail; } };
|