คำถามติดแท็ก linked-list

รายการที่เชื่อมโยงคือโครงสร้างข้อมูลที่องค์ประกอบรายการไม่จำเป็นต้องจัดเก็บตามลำดับ แต่แต่ละองค์ประกอบมีการอ้างอิงถึงองค์ประกอบถัดไป (และเป็นทางเลือกก่อนหน้า) ในรายการ ควรใช้แท็กนี้ร่วมกับแท็กเพิ่มเติมที่ระบุภาษาการเขียนโปรแกรมที่ใช้ ([c], [c ++], [java] ฯลฯ ) และไลบรารีหรือปลั๊กอินที่ใช้เช่น [c ++ - standard-library] ตัวโพสต์ควรมีซอร์สโค้ดสำหรับปัญหา

30
เมื่อใดที่จะใช้ LinkedList ผ่าน ArrayList ใน Java
ฉันเป็นคนหนึ่งที่เคยใช้: List<String> names = new ArrayList<>(); ฉันใช้อินเทอร์เฟซเป็นชื่อประเภทสำหรับการพกพาดังนั้นเมื่อฉันถามคำถามเช่นสิ่งเหล่านี้ฉันสามารถทำงานซ้ำรหัสของฉันได้ เมื่อควรจะLinkedListนำมาใช้มากกว่าArrayListและในทางกลับกัน?

25
จะตรวจจับลูปในรายการที่เชื่อมโยงได้อย่างไร?
สมมติว่าคุณมีโครงสร้างรายการเชื่อมโยงใน Java มันประกอบไปด้วยโหนด: class Node { Node next; // some user data } และแต่ละโหนดชี้ไปที่โหนดถัดไปยกเว้นโหนดสุดท้ายซึ่งมีค่า null สำหรับถัดไป สมมติว่ามีความเป็นไปได้ที่รายการสามารถมีลูป - เช่นโหนดสุดท้ายแทนการมีค่า null มีการอ้างอิงถึงหนึ่งในโหนดในรายการที่มาก่อนมัน เป็นวิธีที่ดีที่สุดในการเขียนอะไร boolean hasLoop(Node first) ซึ่งจะกลับมาtrueถ้าโหนดที่กำหนดเป็นคนแรกของรายการที่มีวงและfalseอื่น ๆ ? คุณจะเขียนอย่างไรเพื่อให้มีเนื้อที่คงที่และใช้เวลาพอสมควร นี่คือภาพของรายการที่มีลักษณะเป็นวง:


30
อาร์เรย์กับรายการที่เชื่อมโยง
ทำไมบางคนต้องการใช้ลิสต์ที่เชื่อมโยงกับอาร์เรย์? ไม่ต้องสงสัยเลยว่าการเขียนโค้ดที่เชื่อมโยงกับลิสต์จะมีงานมากกว่าการใช้อาเรย์และอาจสงสัยว่าอะไรคือเหตุผลที่เพิ่มความพยายาม ฉันคิดว่าการแทรกองค์ประกอบใหม่นั้นไม่สำคัญในรายการที่เชื่อมโยง แต่มันก็เป็นงานที่สำคัญมากในอาเรย์ มีข้อได้เปรียบอื่น ๆ ในการใช้รายการที่เชื่อมโยงเพื่อเก็บชุดของข้อมูลเมื่อเทียบกับการเก็บไว้ในอาร์เรย์หรือไม่? คำถามนี้ไม่ได้ซ้ำกับคำถามนี้เพราะคำถามอื่น ๆ ถามเฉพาะเกี่ยวกับคลาส Java เฉพาะในขณะที่คำถามนี้เกี่ยวข้องกับโครงสร้างข้อมูลทั่วไป

7
ทำไม std :: list :: reverse มีความซับซ้อน O (n)
เหตุใดฟังก์ชันย้อนกลับสำหรับstd::listคลาสในไลบรารีมาตรฐาน C ++ จึงมี Linear runtime ฉันคิดว่าสำหรับรายการที่ลิงก์สองเท่าฟังก์ชันย้อนกลับควรเป็น O (1) การย้อนกลับรายการที่เชื่อมโยงเป็นทวีคูณควรเกี่ยวข้องกับการสลับหัวและตัวชี้ท้าย
192 c++  c++11  stl  linked-list 


28
รายการที่เชื่อมโยงหลาม
วิธีที่ง่ายที่สุดในการใช้รายการที่เชื่อมโยงในหลามคืออะไร? '(1 2 3 4 5)ในรูปแบบรายการที่เชื่อมโยงจะถูกกำหนดโดยเพียงแค่ รายการของ Python [1, 2, 3, 4, 5]และ tuples (1, 2, 3, 4, 5)นั้นไม่ใช่รายการเชื่อมโยงและรายการที่เชื่อมโยงมีคุณสมบัติที่ดีเช่นการต่อเวลาคงที่และสามารถอ้างอิงส่วนแยกของพวกเขาได้ ทำให้พวกมันไม่เปลี่ยนรูปและพวกมันก็ง่ายที่จะทำงานด้วย!

15
เมื่อใดที่จะใช้รายการที่เชื่อมโยงกับรายการอาร์เรย์ / อาร์เรย์
ฉันใช้รายการและอาร์เรย์จำนวนมาก แต่ฉันยังไม่เจอสถานการณ์ที่รายการอาร์เรย์ไม่สามารถใช้งานได้ง่ายเหมือนกับถ้าไม่ง่ายกว่ารายการที่เชื่อมโยง ฉันหวังว่าจะมีบางคนยกตัวอย่างบางอย่างให้ฉันเมื่อรายการลิงก์เชื่อมโยงดีกว่าอย่างเห็นได้ชัด

8
เหตุใด ArrayDeque จึงดีกว่า LinkedList
ฉันพยายามที่จะเข้าใจว่าทำไม ArrayDeque ของ Java จึงดีกว่า LinkedList ของ Javaเนื่องจากทั้งสองใช้ส่วนติดต่อ Deque ฉันแทบจะไม่เห็นใครใช้ ArrayDeque ในรหัสของพวกเขา หากมีใครให้ความกระจ่างเกี่ยวกับวิธีการใช้ ArrayDeque มากขึ้นมันจะมีประโยชน์ ถ้าฉันเข้าใจฉันจะมั่นใจในการใช้มันมากขึ้น ฉันไม่เข้าใจการใช้ JDK อย่างชัดเจนเกี่ยวกับวิธีการจัดการการอ้างอิงส่วนหัวและส่วนท้าย

21
อธิบายว่าการค้นหาโหนดเริ่มรอบในการเชื่อมโยงรายการทำงานอย่างไร
ฉันเข้าใจว่าการประชุมของ Tortoise และ Hare สรุปว่าการมีอยู่ของวงวนนั้นเป็นอย่างไร แต่การย้ายเต่าไปยังจุดเริ่มต้นของรายการที่เชื่อมโยงในขณะที่รักษากระต่าย ณ สถานที่ประชุมตามด้วยการย้ายทั้งสองขั้นในแต่ละครั้ง

6
ฉันจะสร้างโครงสร้างข้อมูลรายการที่เชื่อมโยงใน Java ได้อย่างไร [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา วิธีที่ดีที่สุดในการสร้างรายการที่เชื่อมโยงใน Java คืออะไร?

11
เหตุใดรายการที่เชื่อมโยงจึงใช้พอยน์เตอร์แทนการจัดเก็บโหนดภายในโหนด
ฉันเคยทำงานกับรายการที่เชื่อมโยงมาก่อนใน Java แต่ฉันยังใหม่กับ C ++ มาก ฉันใช้คลาสโหนดนี้ที่มอบให้ฉันในโปรเจ็กต์ได้ดี class Node { public: Node(int data); int m_data; Node *m_next; }; แต่ฉันมีคำถามหนึ่งที่ตอบไม่ดีนัก ทำไมจึงต้องใช้ Node *m_next; เพื่อชี้ไปที่โหนดถัดไปในรายการแทนที่จะเป็น Node m_next; ฉันเข้าใจว่าควรใช้เวอร์ชันตัวชี้จะดีกว่า ฉันจะไม่เถียงข้อเท็จจริง แต่ไม่รู้ว่าทำไมมันดีกว่า ฉันได้รับคำตอบที่ไม่ชัดเจนนักว่าตัวชี้นั้นดีกว่าสำหรับการจัดสรรหน่วยความจำอย่างไรและฉันก็สงสัยว่าใครที่นี่จะช่วยให้ฉันเข้าใจสิ่งนั้นได้ดีขึ้น

15
รายการที่เชื่อมโยงมีประโยชน์ภายใต้สถานการณ์ใดบ้าง
บ่อยครั้งที่ฉันเห็นผู้คนพยายามใช้รายการที่เชื่อมโยงกันดูเหมือนว่าฉันจะเป็นตัวเลือกที่ไม่ดี บางทีอาจเป็นประโยชน์ในการสำรวจสถานการณ์ที่รายการที่เชื่อมโยงเป็นหรือไม่ใช่ทางเลือกที่ดีของโครงสร้างข้อมูล ตามหลักการแล้วคำตอบจะอธิบายถึงเกณฑ์ที่จะใช้ในการเลือกโครงสร้างข้อมูลและโครงสร้างข้อมูลใดที่น่าจะทำงานได้ดีที่สุดภายใต้สถานการณ์ที่กำหนด แก้ไข: ฉันต้องบอกว่าฉันค่อนข้างประทับใจไม่เพียง แต่จำนวน แต่คุณภาพของคำตอบ ฉันยอมรับได้เพียงหนึ่ง แต่ยังมีอีกสองหรือสามอย่างที่ฉันต้องบอกว่ามันควรค่าแก่การยอมรับหากยังไม่มีสิ่งที่ดีกว่านี้อยู่ที่นั่น มีเพียงสองสามคน (โดยเฉพาะอย่างยิ่งคนที่ฉันยอมรับ) ชี้ไปที่สถานการณ์ที่รายการที่เชื่อมโยงให้ประโยชน์อย่างแท้จริง ฉันคิดว่าสตีฟเจสซอปสมควรได้รับรางวัลชมเชยประเภทหนึ่งที่ไม่ใช่แค่คำตอบเดียว แต่เป็นคำตอบที่แตกต่างกันสามคำตอบซึ่งทั้งหมดนี้ฉันพบว่าค่อนข้างน่าประทับใจ แน่นอนแม้ว่าจะโพสต์เป็นเพียงความคิดเห็นไม่ใช่คำตอบ แต่ฉันคิดว่ารายการบล็อกของนีลก็ควรค่าแก่การอ่านเช่นกัน - ไม่เพียง แต่ให้ข้อมูลเท่านั้น แต่ยังให้ความบันเทิงอีกด้วย

30
จะย้อนกลับรายการที่เชื่อมโยงเดี่ยวโดยใช้ตัวชี้สองตัวได้อย่างไร
ฉันสงสัยว่ามีตรรกะบางอย่างในการย้อนกลับรายการที่เชื่อมโยงโดยใช้ตัวชี้เพียงสองตัว ต่อไปนี้จะใช้ในการกลับรายการที่เชื่อมโยงเดียวโดยใช้ตัวชี้สามคือp, q, r: struct node { int data; struct node *link; }; void reverse() { struct node *p = first, *q = NULL, *r; while (p != NULL) { r = q; q = p; p = p->link; q->link = r; } first = q; } มีทางเลือกอื่นในการย้อนกลับรายการที่เชื่อมโยงหรือไม่? อะไรคือตรรกะที่ดีที่สุดในการย้อนกลับรายการที่เชื่อมโยงเพียงอย่างเดียวในแง่ของความซับซ้อนของเวลา

14
เหตุใดจึงแทรกกลางรายการที่เชื่อมโยง O (1)
ตามบทความ Wikipedia เกี่ยวกับรายการที่เชื่อมโยงการแทรกกลางรายการที่เชื่อมโยงถือเป็น O (1) ฉันคิดว่ามันจะเป็น O (n) คุณไม่จำเป็นต้องค้นหาโหนดที่อาจอยู่ใกล้ท้ายรายการหรือไม่? การวิเคราะห์นี้ไม่ได้อธิบายถึงการค้นหาการทำงานของโหนด (แม้ว่าจะจำเป็น) และเป็นเพียงแค่การแทรกเท่านั้นเอง? แก้ไข : รายการที่เชื่อมโยงมีข้อดีหลายประการเหนืออาร์เรย์ การแทรกองค์ประกอบที่จุดเฉพาะของรายการเป็นการดำเนินการที่มีเวลาคงที่ในขณะที่การแทรกในอาร์เรย์อาจต้องการการเคลื่อนย้ายองค์ประกอบครึ่งหนึ่งหรือมากกว่านั้น ข้อความข้างต้นทำให้ฉันเข้าใจผิดเล็กน้อย แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่าข้อสรุปควรเป็น: อาร์เรย์: การหาจุดแทรก / ลบ O (1) การดำเนินการแทรก / ลบ O (n) รายการที่เชื่อมโยง: การหาจุดแทรก / ลบ O (n) การดำเนินการแทรก / ลบ O (1) ฉันคิดว่าครั้งเดียวที่คุณจะไม่ต้องหาตำแหน่งคือถ้าคุณยังคงชี้ไปที่มัน (เช่นเดียวกับหัวและหางในบางกรณี) ดังนั้นเราจึงไม่สามารถพูดได้อย่างชัดเจนว่ารายการที่เชื่อมโยงเอาชนะอาร์เรย์สำหรับตัวเลือกการแทรก / ลบเสมอ
106 linked-list  big-o 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.