Saya telah mengerjakan proyek Java untuk kelas untuk sementara waktu sekarang. Ini adalah implementasi dari daftar tertaut (di sini disebut AddressList
, berisi node sederhana yang disebut ListNode
). Hasil tangkapannya adalah bahwa semuanya harus dilakukan dengan algoritma rekursif. Saya bisa melakukan semuanya dengan baik tanpa satu metode:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
Saat ini reverse
fungsi saya hanya memanggil fungsi pembantu yang membutuhkan argumen untuk memungkinkan rekursi.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Dengan fungsi pembantu saya yang memiliki tanda tangan private ListNode reverse(ListNode current)
.
Saat ini, saya memilikinya bekerja secara iteratif menggunakan tumpukan, tetapi ini bukan yang dibutuhkan spesifikasi. Saya telah menemukan algoritme dalam C yang secara rekursif membalikkan dan mengubahnya menjadi kode Java dengan tangan, dan berhasil, tetapi saya tidak memahaminya.
Sunting: Tidak apa-apa, saya menemukan jawabannya sementara itu.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Selama saya di sini, apakah ada yang melihat ada masalah dengan rute ini?
sumber
Jawaban:
Ada kode dalam satu jawaban yang menjelaskannya, tetapi Anda mungkin merasa lebih mudah untuk memulai dari bawah ke atas, dengan mengajukan dan menjawab pertanyaan-pertanyaan kecil (ini adalah pendekatan dalam The Little Lisper):
sumber
Saya ditanyai pertanyaan ini pada sebuah wawancara dan kesal karena saya meraba-raba karena saya sedikit gugup.
Ini harus membalikkan daftar tertaut tunggal, yang disebut dengan reverse (head, NULL); jadi jika ini adalah daftar Anda:
edit: ive selesai seperti 6 suntingan ini, menunjukkan bahwa itu masih sedikit rumit bagi saya lol
sumber
Saya sudah setengah jalan (sampai null, dan satu node seperti yang disarankan oleh alas), tetapi kehilangan jejak setelah melakukan panggilan rekursif. Namun, setelah membaca pos demi tiang, inilah yang saya dapatkan:
sumber
Inilah solusi rekursif lainnya. Ini memiliki lebih sedikit kode dalam fungsi rekursif daripada yang lain, jadi mungkin sedikit lebih cepat. Ini C # tapi saya yakin Java akan sangat mirip.
sumber
Algo perlu bekerja pada model berikut,
Struktur:
Kode:
Keluaran:
sumber
Saya rasa ini adalah solusi yang lebih bersih, yang menyerupai LISP
sumber
Saya tahu ini adalah posting lama, tetapi sebagian besar jawaban tidak rekursif ekor yaitu mereka melakukan beberapa operasi setelah kembali dari panggilan rekursif, dan karenanya bukan yang paling efisien.
Berikut adalah versi rekursif ekor:
Telepon dengan:
sumber
sumber
sumber
sumber
sumber
Terbalik dengan algo rekursif.
Secara berulang
sumber
Solusi ini menunjukkan bahwa tidak diperlukan argumen.
Berikut adalah kode pendukung, untuk menunjukkan bahwa ini berfungsi:
sumber
Berikut ini pendekatan berulang sederhana:
Dan inilah pendekatan rekursif:
sumber
Karena Java selalu pass-by-value, untuk secara rekursif membalikkan daftar tertaut di Java, pastikan untuk mengembalikan "kepala baru" (node kepala setelah pengembalian) di akhir rekursi.
sumber
PointZeroTwo punya jawaban elegan & sama di Jawa ...
sumber
sumber
panggilan menggunakan: head = reverseRec (null, head);
sumber
Apa yang dilakukan orang lain, di posting lain adalah permainan konten, yang saya lakukan adalah permainan linkedlist, membalikkan anggota LinkedList bukan membalikkan Nilai anggota.
sumber
sumber
Solusinya adalah:
}
sumber
sumber
sumber
sumber
sumber
Terinspirasi oleh artikel yang membahas implementasi permanen dari struktur data rekursif, saya menyusun solusi alternatif menggunakan Swift.
Solusi dokumen jawaban terkemuka dengan menyoroti topik-topik berikut:
Saya telah menyebutkan ini di mana berlaku dalam solusi di bawah ini.
sumber
Membalik daftar tertaut menggunakan rekursi. Idenya adalah menyesuaikan tautan dengan membalik tautan.
sumber
sumber
sumber
Berikut adalah referensi jika seseorang mencari implementasi Scala:
sumber