链表——反转链表之迭代和递归
《我是真的不熟练写链表的操作》
对于正常的迭代我能写,但是也写的非常之抠脑袋(慢慢思考)。
链表部分定义就单独放了:
struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} };
正常的迭代我写的像是这样:
class Solution { public: ListNode *reverseList(ListNode *head) { //迭代 if (head == NULL || head->next == NULL) return head; ListNode *n = head->next, *m; head->next=NULL; while (n) { m = n->next; n->next = head; head = n; n = m; } return head; } };
也是不出所料的非常逊,迷迷糊糊反正写出来没问题,
完美迭代逻辑是这样的:
class Solution { public: ListNode *reverseList(ListNode *head) { ListNode *n = head, *pre = nullptr; while (n) { ListNode *m = n->next; n->next = pre; pre = n; n = m; } return pre; } };
u1s1,看着非常舒服。。。
递归版本,我是想了半天也没写出来,终归是递归写的少,像平常dfs那种都是非常熟悉的了,况且我更多写bfs版本。。。
还是太弱了,,,analysis和code一起了:
class Solution { public: ListNode *reverseList(ListNode *head) { /* analyse: 关键是找到循环处理方式 假设为: n1>n2>n3>...>n(m-1)>n(m)>0 现在为: n1>n2>n3>...>n(k-1)>n(k)>n(k+1)<...<n(m-1)<n(m) 希望n(k)下一个节点n(k+1)指向n(k) 所以是 nk-next-next=nk 需要注意n1下一个节点必须是0 */ if (!head || !head->next) return head; ListNode *n = reverseList(head->next); head->next->next = head; head->next = nullptr; return n; } };

浙公网安备 33010602011771号