好好打球,努力码代码 ,一起加油!
目录
1. 删除链表中等于给定值 val 的所有节点。
给你一个链表的头节点
head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。
删除前
删除后
![](https://img-blog.csdnimg.cn/e8e9904b44204085a1bd22f75462afc3.png)
思路分析
分情况讨论:
1.当链表为空时直接返回null;
2.当链表不为空时,定义一个前驱节点prve和cur,遍
历链表,当cur.val == val时,如图所示,要想删除val=6的值,让prev.next = cur.next,自然就删除了6这个节点,cur=cur.next,继续遍历链表,当要删除节点为最后一个节点时,将prev.next置空。
注意事项:当删除完之后要返回来看看头结点的val是否是要删除的值
![](https://img-blog.csdnimg.cn/e8e9904b44204085a1bd22f75462afc3.png)
代码演示
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return null;
}//链表为空直接返回
ListNode prev = head;
ListNode cur = prev.next;
while(cur!= null){
if(cur.val == val){//为要删除的元素时,更改节点指向
prev.next = cur.next;
cur = cur.next;
}else{
prev = cur;//当不是要删除的元素是,让cur和prev后移
cur = cur.next;
}
}
if(head.val == val){//当遍历删除完之后返回看看头结点是否为要删除的结点
return head.next;
}
return head;
}
}
2.反转一个单链表
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
反转前
反转后
![](https://img-blog.csdnimg.cn/e8e9904b44204085a1bd22f75462afc3.png)
思路分析
分情况讨论:
1.当链表为空时直接返回null;
2.当链表只有一个头结点的时候,返回head;
3.当链表有两个及以上的节点时,原地移动列表,定义一个cur节点,cur = head.next;定义一个curNext来暂存cur之后的节点,以防在反转列表时将后面的节点丢失,先将head置为空,cur.next=head;head= cur;cur= curNext;依次循环知道cur为空反转完成
![](https://img-blog.csdnimg.cn/e8e9904b44204085a1bd22f75462afc3.png)
代码演示
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}//当链表为空直接返回null
if(head.next == null){
return head;
}//当链表只有头结点时,无需反转,直接返回头结点
//当有两个及两个以上节点时
ListNode cur = head.next;
head.next =null;//先将头结点的next置为空
while(cur != null){
ListNode curNext = cur.next;//定义一个curNext来保存后面的结点
cur.next = head;//让当前节点的next指向上一个节点
head = cur;//head更新为下一个节点
cur = curNext;//cur更新为下一个节点
}
return head;//最后返回头结点
}
}
3.返回链表的中间节点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点