203 Eliminar elemento de lista vinculada (cambiar puntero a)

1. Descripción del problema:

Eliminar todos los nodos en la lista vinculada igual al valor dado val.

Ejemplo:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

Fuente:
enlace de LeetCode : https://leetcode-cn.com/problems/remove-linked-list-elements/

2. Análisis de pensamiento:

① De hecho, el problema es fácil de entender. Para el elemento de lista eliminado, solo necesitamos modificar el puntero para resolverlo. Necesitamos usar un nodo ListNode para guardar el último nodo del nodo que se está atravesando, de modo que cuando necesitemos eliminar el nodo Debe apuntar el siguiente campo de puntero del nodo anterior al siguiente nodo del nodo actual para lograr el propósito de eliminar el nodo, aquí debe prestar atención a los siguientes problemas:

1) Cuando el nodo eliminado es el nodo principal, solo necesita mover el puntero hacia abajo

2) Cuando el elemento atravesado es el elemento eliminado, debe apuntar el siguiente campo de puntero del elemento anterior al siguiente nodo

3) Cuando el elemento atravesado no es el nodo anterior, el puntero actual en el campo de puntero anterior se puede mover hacia abajo

② La idea general es relativamente fácil de entender. Eliminar elementos solo necesita cambiar el puntero para completar

3. El código es el siguiente:

Enviar al código de deducción del collar:

import java.util.Scanner;
public class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode p = head;
        /*需要使用一个前缀节点来保存当前节点的上一个节点*/
        ListNode pre = null;
        while (p != null){
            if (p == head && p.val == val) {
                head = head.next;
                p = head;
            }
            else if (p.val == val){
                pre.next = p.next;
                p = pre.next;
            }else {
                pre = p;
                p = p.next;
            }
        }
        return head;
    }
}

Añadir código de prueba:

import java.util.Scanner;
public class Solution {
    /*链表节点*/
    public static class ListNode{
        private int val;
        private ListNode next;
        public ListNode(int val) {
            this.val = val;
        }

        /*重写tostring方法用来输出链表的值*/
        @Override
        public String toString() {
            return val + " ";
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ListNode head = new ListNode(1);
        ListNode next = new ListNode(2);
        head.next = next;
        ListNode next2 = new ListNode(6);
        next.next = next2;
        ListNode next3 = new ListNode(3);
        next.next = next3;
        ListNode next4 = new ListNode(4);
        next3.next = next4;
        ListNode next5 = new ListNode(5);
        next4.next = next5;
        ListNode next6 = new ListNode(6);
        next5.next = next6;
        next6.next = null;
        head = removeElements(head, 6);
        while (head != null){
            System.out.print(head);
            head = head.next;
        }
    }


    public static ListNode removeElements(ListNode head, int val) {
        ListNode p = head;
        /*需要使用一个前缀节点来保存当前节点的上一个节点*/
        ListNode pre = null;
        while (p != null){
            if (p == head && p.val == val) {
                head = head.next;
                p = head;
            }
            else if (p.val == val){
                pre.next = p.next;
                p = pre.next;
            }else {
                pre = p;
                p = p.next;
            }
        }
        return head;
    }
}

 

569 artículos originales publicados · Me gusta 153 · Visitas 590,000+

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/105257787
Recomendado
Clasificación