题目一 移除链表元素
题目:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
解法一
在上篇博客中,有介绍到关于单链表的增删查改。
利用以上思路解题,那相关解法就类似于某特定位置删除节点。
特点:使用双指针
解法二
解法三
不是val节点尾插到新链表
补充知识点:链表循环指的是最后一个节点的next指向第一个节点
链表带头和不带头理解:
链表不带头
链表带头
或者
题目二 合并两个有序链表
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解法:
题目三 链表的中间节点
题目要求:
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
并且要求只遍历链表一次
解法:
设置快慢指针,快指针走两步,慢指针走一步
奇数个元素
偶数个元素
很有意思的一道题,可以这样讲。
题目四 链表中倒数第k个节点
题目要求:输入一个链表,输出该链表中倒数第k个结点。
解法:第一种 设置快慢指针,快指针先于慢指针走k步,再快慢指针同时挪动
第二种 设置快慢指针,快指针先于慢指针走k-1步,再快慢指针同时挪动
在这里遇到一个坑:c语言中遇到间接寻址级别不同这样的错误警报
我的错误点在于:c语言规定函数是先声明再定义的
题目五 反转链表
题目要求:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
解法一:取节点头插新链表
思路:要想完成以上链表的反转,需要借助一个新链表。将反转前的从前往后的节点依次头插到新链表当中去,要注意新链表最后一个节点必须为NULL。那么设置新链表为NULL,在反转前原链表的第一个节点尾插到新链表时,令其next部分指向NULL,完善新链表。这里,以cur来标记反转前原链表节点位置,当节点头插到新链表时,无法找到原链表的下一个节点。这里就需要next来标记要发生头插的原链表节点的下一个节点。
解法二:
数据结构,讲真的,蛮难的!