Menukar dua node yang berdekatan dalam daftar tertaut java

Saya punya masalah yang sangat sepele, yang seharusnya hanya mengganti tautan saja. Saya telah membaca beberapa jawaban, dan beberapa menunjukkan bagaimana melakukan ini dengan menukar data, dan beberapa memberikan penjelasan yang tidak jelas tentang konsep tersebut.

Inilah metode yang sepertinya membuat saya berputar-putar. Ketika saya menukar node target ke node sebelumnya, node tersebut dilewati begitu saja. Kemudian ketika saya kembali ke referensi node berikutnya, saya terjebak dalam lingkaran abadi. Saya perlu tahu apakah saya memerlukan node lain yang melintasi dari kepala, atau apakah saya cukup mereferensikan tautan baru. Saya tahu saya melewatkan sesuatu yang cukup jelas.

for (cursor = head; cursor != null; cursor = cursor.link) {
  if (target == cursor.data) {
    Target = cursor.link.getLink();
    next = cursor.getLink();
    prev = cursor;
    System.out.println(prev.getData()); // for testing
    System.out.println(next.getData());
    prev.setLink(Target); // Swaps the first link
    //Target.setLink(prev); // causes eternal loop
  }}
  return Target.getData();
}

Ini adalah metode pengujian saya, membuat daftar 7 node, dan mencetak ke layar.

public static void main(String[] args) {
  SLL LL = new SLL(18, null);

  LL.add(4);
  LL.add(14);
  LL.add(8);
  LL.add(12);
  LL.add(2);
  LL.add(28);
  System.out.println(LL.toString());
  System.out.println(LL.swap(12));
  System.out.println(LL.toString());
}

Ini adalah output yang saya dapatkan:

{18, 28, 2, 12, 8, 14, 4}

12

8

14

{18, 28, 2, 12, 14, 4}

Output yang diinginkan adalah:

{18, 28, 2, 12, 8, 14, 4}

{18, 28, 2, 8, 12, 14, 4}


person Mattonio    schedule 12.07.2018    source sumber
comment
Jika memungkinkan posting kode untuk kelas SLL dan Target. Saya melihat Anda menggunakan cursor.link kadang-kadang dan cursor.getLink() di lain waktu, jadi tidak jelas tentang perilaku spesifiknya.   -  person lealceldeiro    schedule 12.07.2018
comment
Konstruktor: public SLL(int InitialData, SLL InitialLink) { head = ini; data = Data awal; tautan = Tautan awal; } Semua link harusnya .link, .getLink() hanya saya yang main-main saat tidak berfungsi. Semuanya ada dalam satu kelas   -  person Mattonio    schedule 13.07.2018


Jawaban (1)


Sepertinya Anda mencoba menukar node tertentu (ditentukan oleh nilai node) dengan node setelahnya?.

Solusi termudah untuk masalah yang Anda sampaikan adalah dengan menukar nilainya, alih-alih mencoba menukar node.

Sesuatu seperti ini seharusnya berhasil karena Anda berurusan dengan primitif

if(currNode.value() == targetValue) {
   Node nextNode = currentNode.next();
   currentNode.setValue(nextNode.getValue()); //set the current node's value to the next node's value
   nextNode.setValue(targetValue);
}

Pastikan untuk menangani kasus di mana nilai target Anda berada di node terakhir dalam daftar.

Sunting- karena karena alasan tertentu Anda ingin mengubah tautan, logika umumnya adalah-

  • melacak 3 node: sebelumnya, saat ini, berikutnya
  • atur sebelumnya.link = selanjutnya
  • atur current.link = next.link
  • atur next.link = saat ini
person Orch    schedule 12.07.2018
comment
Ya, saya mencoba menukar node berdasarkan nilai node. Pertanyaan saya adalah bagaimana melakukan ini dengan hanya mengubah tautannya, bukan nilainya. - person Mattonio; 12.07.2018
comment
@Orch juga break; dalam pernyataan if diperlukan, jika tidak, nilai target akan dipindahkan ke akhir daftar - person Jorj; 12.07.2018
comment
@Mattonio apakah ini pertanyaan pekerjaan rumah? Apa alasan Anda tidak dapat menukar nilai? - person Orch; 12.07.2018
comment
@Orch meskipun itu bukan pertanyaan pekerjaan rumah, metode itu tidak bagus. Bagaimana jika node diperluas agar memiliki lebih dari satu bidang? Kemudian Anda harus mengubah metode swap setiap kali kelas node berubah, atau diperluas. - person mypetlion; 12.07.2018
comment
@mypetlion Tanggapan saya berdasarkan pertanyaan yang diajukan. Jika Anda mengubah pertanyaannya, maka jawabannya mungkin akan berubah juga, itu tampak jelas. - person Orch; 12.07.2018
comment
Ini adalah latihan dari struktur data terbuka buku teks. Tujuannya adalah untuk membandingkan efisiensi antara pertukaran dalam daftar tertaut tunggal dan ganda. - person Mattonio; 13.07.2018
comment
Ini seharusnya menjawab pertanyaan Anda. Saat ini cara Anda menyetel tautan salah. - person Orch; 13.07.2018