技術共有

Likou の順序付きリンク リストの重複排除

2024-07-12

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

リンクされたリスト内の重複要素を削除し、重複要素を 1 つ保持します

1ページ目
1 -> 1 -> 2 -> 3 -> 3 -> ヌル

p1.val == p2.val 次に、p2 を削除します。この時点では p1 は変更されていないことに注意してください。

1ページ目
1 -> 2 -> 3 -> 3 -> ヌル

p1.val != p2.val 次に、p1、p2 は後方に移動します。

1ページ目
1 -> 2 -> 3 -> 3 -> ヌル
         
1ページ目
1 -> 2 -> 3 -> 3 -> ヌル

p1.val == p2.val その後、p2 を削除します

1ページ目
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 の値が繰り返される場合、p2 と重複しないノードが見つかるまで p3 は戻り続け、p1 が p3 を指して削除が完了します。

  • p2とp3の値が重ならない場合は、p1、p2、p3を1つ後ろにずらし、上記の動作を継続します。

  • p2 または p3 が null です。ループを終了します。

    • たとえば、p2 が null の場合、リンクされたリストは 1 1 1 null になります。

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き
s、1、1、1、2、3、ヌル

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き
s、1、1、1、2、3、ヌル

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き
s、1、1、1、2、3、ヌル

1ページ目
s、2、3、ヌル

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き
s、2、3、ヌル

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き
s、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. }