Leetcode 203
Two Star Programming方法使用双重指针对链表中的一些节点进行删除
代码:
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode **temp = &head;
while (*temp){
if ((*temp)->val == val)
*temp = (*temp)->next;
else
temp = &(*temp)->next;
}
return head;
}
这种方法的代码非常简洁,但是可能理解起来有些困难,因此下面举一个例子来逐步分析代码
假设链表长度为4,四个节点分别存储了1,1,6,1的数据,现在需要将其中val为1的节点删除
链表及temp和head变量的初始状态如图所示,其中方框内为每个变量对应的值,方框左边每个变量对应的内存地址
假设temp变量的地址为20,其指向的是head变量的地址,即为80,而head变量指向的为第一个节点的开始地址,即为100
第一次迭代:
此时 *temp 即为head,head->val即为地址100处的结构体(绿色)的val值,为1,与进行判断的val(1)相等,因此该节点需要删除,此时执行*temp=(*temp)->next语句,(*temp)->next为108,即将*temp改为108,也就是head=108
修改后的状态如下图:
第二次迭代:
此时*temp为108,非空
(*temp)->val即为地址108处结构体(黄色)的val值,仍然为1,继续需要删除
再次执行*temp=(*temp)->next语句,此时(*temp)->next为116,因此将*temp改为116,也就是head=116
修改后的状态如下图:
第三次迭代:
此时*temp为为116
(*temp)->val即为地址116处结构体(蓝色)的val值,为6,不需要删除
此时执行temp = &(*temp)->next语句,(*temp)->next 为蓝色结构体中的next域,其地址为120,因此此步语句将temp修改为120
修改后的状态如下图:
第四次迭代:
此时*temp即为地址120处的值,即为124,非空
(*temp)->val即为地址124处结构体(红色)的val值,为1,需要删除
执行*temp=(*temp)->next语句,(*temp)->next为红色结构体的next域,即为0,因此*temp修改为0,也就是地址120处的值修改为0
修改后的状态如下图:
此时*temp即为地址120处的值为0,循环结束
可以看到整个循环结束后,head指向116,即为蓝色结构体,而其next域为0,因此将其他三个val为1的节点成功删除
参考链接:http://wordaligned.org/articles/two-star-programming