Compartir tecnología

Likou ordenó la deduplicación de listas vinculadas

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Eliminar elementos duplicados en la lista vinculada y conservar un elemento duplicado

pág. 1 pág. 2
1 -> 1 -> 2 -> 3 -> 3 -> nulo

p1.val == p2.val luego elimine p2, tenga en cuenta que p1 permanece sin cambios en este momento

pág. 1 pág. 2
1 -> 2 -> 3 -> 3 -> nulo

p1.val != p2.val Luego p1, p2 retroceden

pág. 1 pág. 2
1 -> 2 -> 3 -> 3 -> nulo
         
pág. 1 pág. 2
1 -> 2 -> 3 -> 3 -> nulo

p1.val == p2.val luego elimina p2

pág. 1 pág. 2
1 -> 2 -> 3 -> nulo

Cuando p2 == null sale del bucle

código

  1. public ListNode deleteDuplicates(ListNode head) {
  2. // 链表节点 < 2
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. // 链表节点 >= 2
  7. ListNode p1 = head;
  8. ListNode p2;
  9. while ((p2 = p1.next) != null) {
  10. if (p1.val == p2.val) {
  11. p1.next = p2.next;
  12. } else {
  13. p1 = p1.next;
  14. }
  15. }
  16. return head;
  17. }

No conserve ningún elemento duplicado

p1 es el nodo anterior que se eliminará. Cada ciclo compara los valores de p2 y p3.

  • Si los valores de p2 y p3 se repiten, entonces p3 continúa retrocediendo hasta que se encuentra un nodo que no está duplicado con p2 y p1 apunta a p3 para completar la eliminación.

  • Si los valores de p2 y p3 no se superponen, p1, p2 y p3 se desplazan hacia atrás una posición y continúan la operación anterior.

  • p2 o p3 es nulo, salga del ciclo

    • Cuando p2 es nulo, por ejemplo, la lista enlazada es 1 1 1 nula

 

pág. 1 pág. 2 pág. 3
s, 1, 1, 1, 2, 3, nulo

p1 p2 p3
s, 1, 1, 1, 2, 3, nulo

p1 p2 p3
s, 1, 1, 1, 2, 3, nulo

pág. 1 pág. 3
s, 2, 3, nulo

pág. 1 pág. 2 pág. 3
s, 2, 3, nulo

p1 p2 p3
s, 2, 3, nulo

código

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if (head == null || head.next == null) {
  3. return head;
  4. }
  5. ListNode s = new ListNode(-1, head);
  6. ListNode p1 = s;
  7. ListNode p2;
  8. ListNode p3;
  9. while ((p2 = p1.next) != null && (p3 = p2.next) != null) {
  10. if (p2.val == p3.val) {
  11. while ((p3 = p3.next) != null
  12. && p3.val == p2.val) {
  13. }
  14. p1.next = p3;
  15. } else {
  16. p1 = p1.next;
  17. }
  18. }
  19. return s.next;
  20. }