0%

风烟迷津

溽暑

东南季风下的空气湿热而缺少阳光,小区院里的桂花树蜷缩起了叶子,蔫蔫的,无精打采地扇着风。空调吹出清凉的冷气,让我像是久旱逢甘霖,像是沙漠里的骆驼抓住了最后一根稻草。“素晴し~”慵懒的伸腰,长长的哈欠驱散了日午未眠的困意。

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;
}

其图示如下:
凭此,我终于叩开了链表的大门。
”噗~“一声轻响,冰箱门带着怡人的白气拂向面庞,打开雪糕的包装袋,香软的奶油在唇齿间化开,紧缩的眉头也像奶油一样舒展开,在一个惬意的日落,贩卖黄昏…