一 、删除链表中等于给定值 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个结点
代码展示:
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大于链表