public class DeleteNde {
public ListNode removeElements(ListNode head, int val) {
//因为头结点的删除与其他节点不同,
//其他节点删除只需要pre.next = cur.next 即可
//但是头结点因为没有前一个节点 所以head= head.next
//因此刚开始应该提前判断是否需要删除头结点,
//需要注意的第一个头结点删除后.第二的节点变为头结点,仍需判断是否要删除头结点
//所以这里使用一个while循环来删除头结点,直到头结点不为头结点为止
//但是判断头结点的值前应该先判断是否为空,否则会报错,
//因为如果对象为空则该对象相当于只是声明了,并没有赋值,所以它的属性并没有定义,所以访问会报错
//下来使用循环遍历即可,当一个节点为null时.则遍历完毕,输出此时的头结点即可
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) {
return head;
}
ListNode pre = head;
ListNode cur = head.next;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else pre = cur;
cur = cur.next;
}
return head;
}
//版本二
//上面版本中,因为头结点需要单独判断所以代码略显复杂,
//这次换个思路,如果没有头结点的话不久不用单独判断了吗
//解决方法,新建一个节点将这个节点放到最前面当成临时头结点,
//这用链表就不用单独判断头结点了,因为现在的头结点是我们自己定义的,返回结构时我们返回的应该是现在头结点的下一位
public ListNode removeElements1(ListNode head, int val) {
ListNode newHead = new ListNode(0, head);
ListNode pre = newHead;
ListNode cur = newHead.next;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return newHead.next;
}
}
leedcode 算法学习记录 链表 移除元素
最新推荐文章于 2024-09-14 20:30:05 发布