溽暑
东南季风下的空气湿热而缺少阳光,小区院里的桂花树蜷缩起了叶子,蔫蔫的,无精打采地扇着风。空调吹出清凉的冷气,让我像是久旱逢甘霖,像是沙漠里的骆驼抓住了最后一根稻草。“素晴し~”慵懒的伸腰,长长的哈欠驱散了日午未眠的困意。
C++链表
在熟悉链表的操作之后我就开始学习交换节点,这个就引入了如何借助指针来删除节点,同时释放内存。假设我们要删除倒数第N个节点,那么我们会有如下代码:
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 31 32
| struct ListNode{ int val; ListNode* next; ListNode(int val, ListNode* next = nullptr) : val(val), next(next) {} }; class solution{ public: ListNode* remove(ListNode* head,int N) { ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* fast = dummy; ListNode* slow = dummy; while (fast->next != nullptr && N > 0) { fast = fast->next; N--; } while (fast->next != nullptr) { slow = slow->next; fast = fast->next; } ListNode* tmp = slow->next; slow->next = slow->next->next; delete tmp; ListNode* result = dummy->next; delete dummy; return result; } };
|
其中涉及了快慢指针和释放内存的基本操作和一些数学上的逻辑,总体而言是非常简单的(真的吗?真的吗🥹?我的小猪脑一整个要烧了。。。)。
还有你,交换相邻的两个节点,最核心的逻辑部分如下:
1 2 3 4 5 6 7 8 9 10 11
| while(cur->next != nullptr && cur->next->next != nullptr){ ListNode* tmp = cur->next; ListNode* tmp1 = cur->next->next->next;
cur->next = cur->next->next; cur->next->next = tmp; cur->next->next->next = tmp1;
cur = cur->next->next; }
|
![其图示如下:]()
凭此,我终于叩开了链表的大门。
”噗~“一声轻响,冰箱门带着怡人的白气拂向面庞,打开雪糕的包装袋,香软的奶油在唇齿间化开,紧缩的眉头也像奶油一样舒展开,在一个惬意的日落,贩卖黄昏…