一、 题单
206.反转链表 |
203.移除链表元素 |
876.链表的中间结点 |
BM8 链表中倒数最后k个结点 |
21.合并两个有序链表 |
二、题目简介及思路
206.反转链表
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
思路简单,但是除了要两个指针进行反转外,还需要一个指针保存链接关系。
我的题解
203.移除链表元素
给你一个链表的头节点
head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。
方法一:遍历删除所有值为val的值
我的题解
方法二:找值不是val的尾插到新链表返回
我的题解
876.链表的中间结点
给你单链表的头结点
head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
快慢指针,一开始都指向头,然后快的走两步,慢的走一步,最后慢的会正好停在中间。
我的题解
BM8 链表中倒数最后K个结点
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。
可以使用先遍历一变数个数,再遍历一遍到倒数第k个数,但是这样麻烦且繁琐。
可以使用快慢指针,让快指针先走k步,快慢指针再一起走。
我的题解
21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
取小的尾插, 比203的还简单一点,但是也要考虑一些细节。
我的题解
三、总结
- 单链表在进行操作的时候,一定要注意它的链接关系,可能需要定义多个指针才能完成操作,要时刻注意链接关系是否已经改变,一定要画图!!
- 新链表尾插,快慢指针,改变链接关系...
- 尾插要考虑这个链表是不是空的,不要对空指针进行一顿操作。
- 特殊情况一定要多找找,多列举,带入边界值尝试,有很多小细节。