数据结构OJ题——移除链表元素
Posted GreenHandXJT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构OJ题——移除链表元素相关的知识,希望对你有一定的参考价值。
数据结构OJ题——移除链表元素
方法一:在原链表的基础上遍历
struct ListNode* removeElements(struct ListNode* head, int val)
{
while (head != NULL && head->val == val) {
head = head->next;
}
if (head == NULL) {
return NULL;
}
struct ListNode* pre = head;
while (pre->next != NULL) {
/* 找到值为 val 的节点并删除 */
if (pre->next->val == val)
{
pre->next = pre->next->next;
}
else
{
/*没找到继续遍历寻找 */
pre = pre->next;
}
}
return head;
}
下面两幅图是我在平板上写的对极端情况的思考(这个地方很容易出错),以及对
while (pre->next != NULL) {
/* 找到值为 val 的节点并删除 */
if (pre->next->val == val)
{
pre->next = pre->next->next;
}
这段代码的理解(这段代码非常的秒,有很多的妙用).
方法二:重新创建一个空链表,进行尾插
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* newnode=NULL;
while(head!=NULL&&head->val==val)
{
head=head->next;
}
if(head==NULL)
{
return NULL;
}
struct ListNode*cur=head;
newnode=cur;
struct ListNode* tail=cur;
while(cur->next)
{
if(cur->next->val==val)
{
cur->next=cur->next->next; //cur=cur->next->next;//前面一种写法就可以巧妙的避免连续2个6的情况,而后面的写法不能
}
else
{
cur=cur->next;
tail->next=cur;
tail=tail->next;
}
}
tail->next=NULL;
return head;
}
这段代码要注意的就是最后结束了,一定不要忘了把tail->next赋值为空
总结对比
方法一的思路比较容易想到,一个个遍历过去,是的就保留,不是的就销毁(也可以不销毁,如代码中一样,直接跳到下下个节点去),不过这段代码写的时候很讲究写法和技巧,写法不好的话,考虑的情况就很多,而且很复杂,再加上这段代码的细节也很多,很容易出错;方法二,代码没有太多的细节,写起来简单,但思路不容易想到。总的来说,在写这种考你逻辑能力的oj题时,一定要多画图,画图时要想好每一步以及下一步应该怎么走,这中间也要把一些极端情况考虑进去.
以上是关于数据结构OJ题——移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章