【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206

简介: 【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206

移除链表元素


203. 移除链表元素


给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。


示例 1:


7cca6cfa66cf68158330c5b5ce6ad5e4_2c2412948175261c163441a9e63103d3.jpeg


输入:head = [1,2,6,3,4,5,6], val = 6

输出:[1,2,3,4,5]

示例 2:


输入:head = [], val = 1

输出:[]

示例 3:


输入:head = [7,7,7,7], val = 7

输出:[]

提示:


列表中的节点数目在范围 [0, 104] 内


1 <= Node.val <= 50


0 <= val <= 50


思路


题目思路:要移除值为val的元素,就涉及到了单链表的头删和中间位置删除,这就需要我们定义一个prev指针指向要删除元素的前一个元素,然后让它指向要删除元素的后一个元素。

prev指针一开始定义为NULL,当链表当前位置即为要删除元素的位置且prev指针为空时,就需要用到单链表头删的知识来考虑这一种情况。

不需要删除的情况就让prev指针指向tail指针的位置,让tail指向下一个位置。

需要删除且不为头删时,写法就是单链表中间删除的写法,让前一个指针指向删除位置的下一个,把要删除的位置free掉即可。


源码


struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*tail=head,*prev=NULL;
while(tail!=NULL)
{
    if(tail->val!=val)
    {
        prev=tail;
    tail=tail->next;
    }
    else
    {
    if(prev==NULL)
    {
        head=head->next;
        tail=head;
    }
    else
    {
        prev->next=tail->next;
        free(tail);
        tail=prev->next;
    }
    }
}
return head;
}


反转链表


206. 反转链表


给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


示例 1:


bc16184f9522ab4fd5b80e8ea94ac564_208ba9e72b2e7060e97a687b54d39e0f.jpeg


输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

示例 2:


0e926bccf40333522e6490b946648952_ad249a9767782b3273b6f2fe85fe9cfc.jpeg


输入:head = [1,2]

输出:[2,1]

示例 3:


输入:head = []

输出:[]

提示:


链表中节点的数目范围是 [0, 5000]

-5000 <= Node.val <= 5000


思路


反转单链表,我采用头插法,对每一个结点采用头插。


定义一个中间变量temp,将cur->next赋值给它,保存它的值,便于一会使用。


定义一个pre为空,让cur->next指向它。一开始的情况是这样的。


a15b9aa4be867e73664a41c68b296b4c_b8a32761448949a89f382dc51475e995.png


之后我们将cur的值赋给pre,让cur指向它的下一个。


可它的next已经变成pre了,没法直接 cur=cur->next。


这是我们上面定义的temp就派上用场了。


将temp的值赋给cur。


这时的情况变成了这样。


dc68e5a0bb45df14eb2fa2761da5be08_e497e12010574ee58faac5de3314ca28.png


这样到最后,情况会变成这样。


572360e37cbf9f01731cc0f7b5883f91_35b336af655a493bb9fca6f82eaae116.png

所以循环的条件应该是while(cur)。


源码


struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head,*pre=NULL;
while(cur)
{
    struct ListNode*temp=cur->next;
    cur->next=pre;
    pre=cur;
    cur=temp;
}
return pre;
}

如果大家有更好的方法,请一定要私信教教我!求大佬带带。



相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
48 0
Leetcode第21题(合并两个有序链表)
|
1月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
32 0
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
40 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
77 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
16 0
|
1月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
29 0