删除链表中等于给定值 val 的所有节点
给你一个链表的头节点 head 和一个整数 val
请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
例如:
- 力扣链接: 删除链表中等于给定值 val 的所有节点
想要做好题,就要先理解力扣给得参数,看下图:
力扣上传了二个参数过来:
head
代表链表的头节点
val
代表要删除的元素
题解:
创建二个变量,cur 赋值 head.next
,它指向 head
引用的地址,prev 赋值 head
,它指向 head
cur
用来判断当前需要删除的节点
prev
代表当前需要删除节点的前一个节点
源题代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
//判断链表是否为空链表
if(head == null){
return null;
}
ListNode cur = head.next;//cur 存储的是 head 下一个节点地址
ListNode prev = head; // perv 指向 head 头节点
while(cur != null){
// 判断 cur 所在节点的值是否等于 val 元素
if(cur.val == val){
prev.next = cur.next;
cur = cur.next;
}else{
prev = cur;
cur = cur.next;
}
}
// 判断第一个节点是否等于 val 值
if(head.val == val){
head = head.next;
}
// 返回新的节点
return head;
}
}
反转链表
给你一个单链表的头节点 head ,请你反转链表,并返回反转后的链表
- 力扣链接: 反转链表
力扣上传了一个参数过来:
head
代表链表的头节点
题解:
最先判断传过来的参数是否为 null ,之后判断传过来的链表是否是只有一个节点
如果只有一个节点直接返回不用反转
接下来就是先把头节点制为 null ,之后是修改节点的指向
源题代码:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
if(head.next == null){
return head;
}
ListNode cur = head.next;
head.next = null;
while(cur != null){
ListNode curNext = cur.next;
cur.next = head;
head = cur;
cur = curNext;
}
return head;
}
}
链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示范1:
链表元素:1 2 3 4 5
其中间元素是: 3
示范2:
链表元素:1 2 3 4 5
其中间元素是: 3 和 4 返回第二个元素 4
- 力扣链接: 链表的中间结点
传过来的参数head
是头节点
题解:
这题可以使用快慢指针
来解决
快慢指针:A和B二个变量同时出发,A的速度是B的二倍,当A到达终点时,B的位置就在中间位置
这有二种情况:偶数和奇数
奇数:一次走二步最后肯定是走到末尾的,判断条件是 A.next != null
偶数:一次走二步最后走到的是末尾后一个元素位置,判断条件是 A != null
判断的顺序是:偶数在奇数