Обмен технологиями

Дедупликация упорядоченного связанного списка Ликоу

2024-07-12

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

Удалите повторяющиеся элементы в связанном списке и сохраните один повторяющийся элемент.

стр1 стр2
1 -> 1 -> 2 -> 3 -> 3 -> ноль

p1.val == p2.val, затем удалите p2, обратите внимание, что p1 в это время остается неизменным.

стр1 стр2
1 -> 2 -> 3 -> 3 -> ноль

p1.val != p2.val Затем p1, p2 перемещаются назад.

стр1 стр2
1 -> 2 -> 3 -> 3 -> ноль
         
стр1 стр2
1 -> 2 -> 3 -> 3 -> ноль

p1.val == p2.val, затем удалите p2

стр1 стр2
1 -> 2 -> 3 -> ноль

Когда p2 == null выйти из цикла

код

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

Не оставляйте повторяющиеся элементы

p1 — предыдущий узел, который нужно удалить. Каждый цикл сравнивает значения p2 и p3.

  • Если значения p2 и p3 повторяются, то p3 продолжает двигаться назад до тех пор, пока не будет найден узел, не дублирующийся p2, а p1 указывает на p3 для завершения удаления.

  • Если значения p2 и p3 не перекрываются, p1, p2 и p3 сдвигаются назад на одну позицию и продолжают описанную выше операцию.

  • p2 или p3 имеет значение null, выйдите из цикла

    • Например, когда p2 имеет значение null, связанный список имеет значение 1 1 1 null.

 

стр1 стр2 стр3
с, 1, 1, 1, 2, 3, ноль

стр1 стр2 стр3
с, 1, 1, 1, 2, 3, ноль

стр1 стр2 стр3
с, 1, 1, 1, 2, 3, ноль

стр1 стр3
с, 2, 3, ноль

стр1 стр2 стр3
с, 2, 3, ноль

стр1 стр2 стр3
с, 2, 3, ноль

код

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