注意我框选的部分:
这题考点不多,就这点。
根据题目提示:如果几个节点是连续的,且它们的val 和 0,就把它们全删除。
我的思路: 我一开始就构造一个方法。用来删除总和为0的几个连续的节点,拿到头节点就往这个方法里一丢,因为 head头节点本身的val值可能为零,另外,即便头节点val值不为零,但不代表 它与后面的几个节点的 val值 之和,就不为零!所以我一开始就把 头节点 丢进 方法 是为了确定 真正的头节点。之后创建一个头节点替身cur,用它去遍历链表,同时再遇到这样和为零的几个节点,直接把 cur 的next丢进去,将得出的结果重新赋予cur.next。不就即删除满足条件的节点,又将链表给重新链接了。
public ListNode sumIsZero(ListNode head){
if(head == null){
return head;// 链表为空,都没节点,还删什么,撤退!
}
if(head.val == 0){
head = head.next;// head自身val等于 0,都不用其它节点帮忙,它第一个被删除
}
ListNode cur = head;// 头节点替身变量
// 现在排除head自身val为0的情况,现在就是判断头节点 与 后面几个节点的val和,是否满足为零的情况
int sum = 0; // 记录 连续节点 的 val 和。
while(cur != null){
sum += cur.val;// 累加
if(sum == 0){//如果满足,那么说从head到cur,这几个节点和为 0,需要被删除,直接返回 cur 的下一个节点
return cur.next;
}
cur = cur.next;//不满足,cur继续遍历
}
return head;// 执行到这,说 从 head 开始,一直到尾结点,所有的节点和都不为 0,这时直接返回 head
}
此时,head 指向的就是真正的头节点位置。
至于为什么加上while循环,是为了防止头节点与其后面的节点满足删除条件,删除后,我们得到了下一个节点的地址,但是如果 这个节点,又与其后面的节点 构成删除条件,或 自身val 为 0,也会构成删除条件
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode removeZeroSumSublists(ListNode head) {
while(true){
ListNode newHead = sumIsZero(head);
if(head == newHead){
break;
}
head = newHead;
}
ListNode cur = head;// 此时cur指向的节点,不满足删除条件
while(cur!=null){
ListNode next = sumIsZero(cur.next);// 判断cur 下一个节点是否满足删除条件
if(cur.next == next){// 如果不满足,即cur下一个节点不满足删除条件,next值不变
cur = next;//cur 继续遍历链表 :next == cur.next
}else{// 反之,满足删除条件,即将cur的next值更新。完成删除。
cur.next = next;
}
}
return head;
}
public ListNode sumIsZero(ListNode head){
if(head == null){
return head;
}
if(head.val == 0){
head = head.next;
}
ListNode cur = head;
int sum = 0;
while(cur != null){
sum += cur.val;
if(sum == 0){
return cur.next;
}
cur = cur.next;
}
return head;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/DarkAndGrey/article/details/122303743
内容来源于网络,如有侵权,请联系作者删除!