链表OJ题(1)

简介: 链表OJ题(1)

一 、删除链表中等于给定值 val 的所有节点。

https://leetcode.cn/problems/remove-linked-list-elements/description/

代码展示:

1. struct ListNode* removeElements(struct ListNode* head, int val){
2. struct ListNode* cur = head;
3. struct ListNode* prev = NULL;
4. while (cur)
5.     {
6. struct ListNode* next = cur->next;
7. if (cur->val != val)
8.         {
9.             prev = cur;
10.             cur = next;
11.         }
12. else
13.         {
14. if (prev == NULL)
15.             {
16.                 head = next;
17.                 free(cur);
18.                 cur = next;
19.             }
20. else
21.             {
22.                 prev->next = next;
23.                 free(cur);
24.                 cur = next;
25.              }
26.         }
27. 
28.     }
29. return head;
30. 
31. }

思路:(1)首先给出判断cur是否是空的,不是空的之后,判断是否有val,有的话就判断是否在头部,是的话一种情况,不是的话,又是一种情况。(2)第一种情况,题意所给出的情况;第二种情况,中间连续个value(前两种可以合并);第三种情况,一开始就出现6或者连续个6;第四种情况:空的

注意:(1)每一道题,都要考虑多种情况,不仅仅是力扣所给出的情况。

(2)编译错误:代码错误;执行错误:逻辑错误

二、  反转一个单链表。

https://leetcode.cn/problems/reverse-linked-list/

代码1展示:(思路一)

1. struct ListNode* reverseList(struct ListNode* head){
2. struct ListNode* cur = head;
3. struct ListNode* prev = NULL;
4. while(cur)
5.     {
6. struct ListNode* next = cur->next;
7.         cur ->next = prev;
8.         prev = cur;
9.         cur = next;
10.     }
11. return prev;
12. }

代码2展示:(思路二)

1. struct ListNode* reverseList(struct ListNode* head)
2. {
3. struct ListNode* cur = head;
4. struct ListNode* newhead = NULL;
5. while (cur)
6.     {
7. struct ListNode* next = cur->next;
8.         cur->next = newhead;
9.         newhead = cur;
10.         cur = next;
11.     }
12. return newhead;
13. }

思路一:指向前一个

思路二:头插,创建一个新的链表,newlist,为空。先保存旧链表cur的next,然后,cur->next指向新的链表,新的链表head指向cur,以此重复,一直到cur为空停止。

注意:能写循环的话,不写递归

三、 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

https://leetcode.cn/problems/middle-of-the-linked-list/description/

代码展示:

1. struct ListNode* middleNode(struct ListNode* head)
2. {
3. struct ListNode* slow = head;
4. struct ListNode* fast = head;
5. while (fast && (fast ->next))
6.     {
7.         slow = slow ->next;
8.         fast = fast->next->next;
9.     }
10. return slow;
11. }

思路:首先定义两个指针,一个(slow)每次走一个,另一个(fast)每次走两个数据,奇数个时:当fast->next等于NULL时,slow刚好是中间。偶数个时,当fast等于NULL时,slow刚好是中间值的第二个。

注意:while (fast && (fast ->next));当两个条件有关系的时候,要注意前后,这个代码条件前后颠倒就会发生错误。

四、输入一个链表,输出该链表中倒数第k个结点

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

代码展示:

1. struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
2. // write code here
3. struct ListNode* slow = pListHead;
4. struct ListNode* fast = pListHead;
5. for (int i = 0; i < k; i++)
6.     {
7. //k大于链表的长度
8. if (fast == NULL)
9.         {
10. return NULL;
11.         }
12.         fast = fast->next;
13.     }
14. while (fast != NULL)
15.     {
16.         slow = slow->next;
17.         fast = fast->next;
18.     }
19. return slow;
20. }

思路:首先定义两个指针,fast和slow;先让fast走K个,然后slow和fat一起走,当fast为NULL时,slow就是倒数第k个。

注意:K大于链表

相关文章
|
13天前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
21 7
|
3月前
【数据结构OJ题】环形链表
力扣题目——环形链表
36 3
【数据结构OJ题】环形链表
|
3月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
50 1
【数据结构OJ题】复制带随机指针的链表
|
3月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
28 1
【数据结构OJ题】环形链表II
|
3月前
【数据结构OJ题】相交链表
力扣题目——相交链表
31 1
【数据结构OJ题】相交链表
|
3月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
38 8
【数据结构OJ题】合并两个有序链表
|
3月前
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
39 2
【数据结构OJ题】移除链表元素
|
3月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
31 1
【数据结构OJ题】链表中倒数第k个结点
|
3月前
【数据结构OJ题】链表分割
牛客题目——链表分割
28 0
【数据结构OJ题】链表分割
|
3月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
34 0
【数据结构OJ题】链表的回文结构