Compartilhamento de tecnologia

Desduplicação de lista vinculada ordenada do Likou

2024-07-12

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

Exclua elementos duplicados na lista vinculada e mantenha um elemento duplicado

p1 p2
1 -> 1 -> 2 -> 3 -> 3 -> nulo

p1.val == p2.val então exclua p2, observe que p1 permanece inalterado neste momento

p1 p2
1 -> 2 -> 3 -> 3 -> nulo

p1.val != p2.val Então p1, p2 movem-se para trás

p1 p2
1 -> 2 -> 3 -> 3 -> nulo
         
p1 p2
1 -> 2 -> 3 -> 3 -> nulo

p1.val == p2.val então exclua p2

p1 p2
1 -> 2 -> 3 -> nulo

Quando p2 == null sai do loop

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. }

Não retenha nenhum elemento duplicado

p1 é o nó anterior a ser excluído. Cada ciclo compara os valores de p2 e p3.

  • Se os valores de p2 e p3 forem repetidos, então p3 continua a retroceder até que um nó que não seja duplicado com p2 seja encontrado, e p1 aponta para p3 para completar a exclusão.

  • Se os valores de p2 e p3 não se sobrepõem, p1, p2 e p3 são deslocados para trás em uma posição e continuam a operação acima.

  • p2 ou p3 é nulo, saia do loop

    • Quando p2 é nulo, por exemplo, a lista vinculada é 1 1 1 null

 

p1 p2 p3
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

p1 p3
s, 2, 3, nulo

p1 p2 p3
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. }