คำนำ
รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลพื้นฐานทั่วไป มันเป็นตารางเชิงเส้น แต่ไม่ได้เก็บไว้ตามลำดับในหน่วยความจำ มันถูกเก็บไว้ในรูปแบบโซ่ แต่ละโหนดจะเก็บ "ตัวชี้" ของโหนดถัดไป ข้อมูลใน Java แบ่งออกเป็นชนิดข้อมูลอ้างอิงและประเภทข้อมูลพื้นฐาน ไม่มีแนวคิดของพอยน์เตอร์ใน Java แต่สำหรับรายการที่เชื่อมโยงพอยน์เตอร์อ้างถึงที่อยู่ของชนิดข้อมูลอ้างอิง
รายการที่เชื่อมโยงและอาร์เรย์เป็นทั้งโครงสร้างข้อมูลเชิงเส้นและความยาวของพวกเขาได้รับการแก้ไขสำหรับอาร์เรย์ เนื่องจากพวกเขามีความทรงจำอย่างต่อเนื่องจึงเหมาะสำหรับการค้นหาและการสำรวจ รายการที่เชื่อมโยงจะไม่ถูกจัดเก็บตามลำดับในหน่วยความจำ แต่เนื่องจากประกอบด้วย "พอยน์เตอร์" จึงสะดวกกว่าในการเปรียบเทียบอาร์เรย์เมื่อแทรกและลบ
รหัสต่อไปนี้ใช้โครงสร้างข้อมูลอย่างง่ายของรายการที่เชื่อมโยงที่อธิบายไว้ในภาษา Java ผ่านคลาสภายในและวิธีการเรียกซ้ำ ลองมาดูการแนะนำรายละเอียด
คำจำกัดความของโครงสร้างข้อมูลรายการที่เชื่อมโยง
ก่อนอื่นมาดูคำจำกัดความของโครงสร้างข้อมูลรายการที่เชื่อมโยงรหัสมีดังนี้:
คลาส nodeManager {รูทโหนดส่วนตัว; // รูทโหนดส่วนตัว int currentIndex = 0; // หมายเลขซีเรียลโหนดการดำเนินการแต่ละครั้งเริ่มต้นจาก 0 โมฆะสาธารณะเพิ่ม (ข้อมูล int) {} โมฆะสาธารณะ delnode (ข้อมูล int) {} public void print () {} public boolean findnode (ข้อมูล int) {} public boolean updatenode (int olddata โหนดคลาสเมธอด {ข้อมูล INT ส่วนตัว; โหนดส่วนตัวถัดไป; // ใช้ประเภทปัจจุบันเป็นโหนดสาธารณะ (ข้อมูล int) {this.data = data; } โมฆะสาธารณะ setData (ข้อมูล int) {this.data = ข้อมูล; } public int getData () {ส่งคืนข้อมูล; } // เพิ่มโหนดโมฆะสาธารณะ addNode (ข้อมูล int) {} // ลบโหนดโมฆะสาธารณะ delnode (ข้อมูล int) {} // เอาต์พุตโหนดทั้งหมดโมฆะสาธารณะ printNode () {} // ค้นหาว่าโหนด public Boolean findNode (int data) แทรกโมฆะสาธารณะ INSERTNODE (INT INDEX, ข้อมูล int) {}}}สำหรับคำจำกัดความของรายการที่เชื่อมโยงคลาส NodeManager จะใช้ในการจัดการการดำเนินการรายการที่เชื่อมโยงในขณะที่โหนดระดับสมาชิกภายในของสมาชิกจะใช้เพื่อให้ข้อมูลรายการที่เชื่อมโยงและโครงสร้างโซ่ สำหรับผู้ใช้ในชั้นเรียนข้อมูลไม่สามารถเข้าถึงได้โดยตรงดังนั้นคลาส NodeManager จึงทำงานและโหนดคลาสภายในให้การจัดการข้อมูลจริง ดังนั้นคลาสโหนดจำเป็นต้องจัดเตรียมวิธีการทำงานของข้อมูลจริงและคลาส NodeManager ยังจำเป็นต้องจัดเตรียมชุดของวิธีการในการใช้งานรายการที่เชื่อมโยงโดยภายนอก ดังนั้นทั้งคลาส NodeManager และคลาสโหนดให้วิธีการเดียวกัน แต่ความหมายที่แท้จริงไม่เหมือนกัน
ลองตรวจสอบเมธอด Add () ในคลาส NodeManager และคลาสโหนด รหัสมีดังนี้:
โมฆะสาธารณะเพิ่ม (ข้อมูล int) {ถ้า (root == null) {root = new node (data); } else {root.addNode (ข้อมูล); }} // เพิ่มโมฆะสาธารณะโมฆะ addNode (ข้อมูล int) {ถ้า (this.next == null) {this.next = new node (data); } else {this.next.addnode (ข้อมูล); -วิธีการข้างต้นในรหัสเป็นวิธีการในคลาส NodeManager ในขณะที่วิธีการต่อไปนี้เป็นวิธีในคลาสโหนด
ตัวแปรสมาชิกรูทมีให้ในคลาส Manager ซึ่งใช้ในการจัดการโหนดหัวของรายการที่เชื่อมโยง ดังนั้นเมื่อเพิ่มโหนดมันจะพิจารณาก่อนว่ารูทจะว่างเปล่า หากว่างเปล่าโหนดจะถูกบันทึกโดยตรงโดยรูท หากรูทไม่ว่างเปล่ามันจะถูกเพิ่มผ่านเมธอด addNode () ในคลาสโหนด แนวคิดของการเพิ่มลงในจุดคือการค้นหาโหนดสุดท้ายของรายการที่เชื่อมโยงปัจจุบันและกำหนดเพิ่มเติมใหม่ให้กับตัวแปรสมาชิกถัดไปที่โหนดถูกกำหนดให้กับโหนดสุดท้าย
เพิ่มลบแก้ไขและตรวจสอบรายการที่เชื่อมโยง
แนวคิดเดียวกันนี้ยังมอบให้กับการดำเนินการอื่น ๆ ในรายการที่เชื่อมโยง รหัสที่สมบูรณ์สำหรับการเพิ่มการลบการดึงและเอาต์พุตของรายการที่เชื่อมโยงมีดังนี้:
คลาส nodeManager {รูทโหนดส่วนตัว; // รูทโหนดส่วนตัว int currentIndex = 0; // หมายเลขซีเรียลโหนดการดำเนินการแต่ละครั้งเริ่มต้นจาก 0 โมฆะสาธารณะเพิ่ม (ข้อมูล int) {ถ้า (root == null) {root = new node (data); } else {root.addNode (ข้อมูล); }} โมฆะสาธารณะ delnode (ข้อมูล int) {ถ้า (root == null) return; if (root.getData () == data) {node tmp = root; root = root.next; tmp = null; } else {root.delnode (data); }} public void print () {if (root! = null) {system.out.print (root.getData () + ""); root.printNode (); System.out.println (); }} บูลีนสาธารณะ findNode (ข้อมูล int) {ถ้า (root == null) ส่งคืนเท็จ; if (root.getData () == ข้อมูล) {return true; } else {return root.findNode (ข้อมูล); }} บูลีนสาธารณะ updatenode (int olddata, int newData) {ถ้า (root == null) ส่งคืนเท็จ; if (root.getData () == oldData) {root.setData (newData); กลับมาจริง; } else {return root.updatenode (olddata, newData); }} // แทรกโมฆะสาธารณะแทรก (ดัชนี int, ข้อมูล int) {ถ้า (ดัชนี <0) ส่งคืน; currentindex = 0; if (index == currentIndex) {node newNode = new node (data); newNode.next = root; root = newNode; } else {root.insertNode (ดัชนี, ข้อมูล); }} // ใครก็ตามที่เป็นเจ้าของข้อมูลที่ให้โหนดคลาสเมธอด {ข้อมูล INT ส่วนตัว; โหนดส่วนตัวถัดไป; // ใช้ประเภทปัจจุบันเป็นโหนดสาธารณะ (ข้อมูล int) {this.data = data; } โมฆะสาธารณะ setData (ข้อมูล int) {this.data = ข้อมูล; } public int getData () {ส่งคืนข้อมูล; } // เพิ่มโหนดโมฆะสาธารณะ addNode (int data) {ถ้า (this.next == null) {this.next = new node (data); } else {this.next.addnode (ข้อมูล); }} // ลบโมฆะสาธารณะโมฆะ delnode (ข้อมูล int) {ถ้า (this.next! = null) {ถ้า (this.next.getData () == ข้อมูล) {node tmp = this.next; this.next = this.next.next; tmp = null; } else {this.next.delnode (ข้อมูล); }}} // เอาต์พุตโหนดทั้งหมดโมฆะสาธารณะ printNode () {ถ้า (this.next! = null) {system.out.print (this.next.getData () + ""); this.next.printnode (); }} // ค้นหาว่าโหนดนั้นมีอยู่ในบูลีนสาธารณะ findNode (ข้อมูล int) {ถ้า (this.next! = null) {ถ้า (this.next.getData () == ข้อมูล) {return true; } else {return this.next.findnode (ข้อมูล); }} return false; } // แก้ไขโหนดสาธารณะบูลีน updatenode (int oldData, int newData) {ถ้า (this.next! = null) {ถ้า (this.next.getData () == oldData) {this.next.set.setData (newData); กลับมาจริง; } else {return this.next.updatenode (olddata, newdata); }} return false; } // แทรกโมฆะสาธารณะ INSERTNODE (INT ดัชนี int, ข้อมูล int) {CurrentIndex ++; if (index == currentIndex) {node newNode = new node (data); newNode.next = this.next; this.next = newNode; } else {this.next.insertNode (ดัชนี, ข้อมูล); -ด้านบนเป็นรหัสที่สมบูรณ์สำหรับการดำเนินการพื้นฐานของรายการที่เชื่อมโยง ต่อไปนี้เป็นรหัสการโทรสำหรับการทดสอบรหัสมีดังนี้:
LinkList คลาสสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {nodeManager nm = noveManager ใหม่ (); System.out.println ("ที่อยู่ของรายการที่เชื่อมโยง (เพิ่ม 5, 4, 3, 2, 1)"); nm.add (5); nm.add (4); nm.add (3); nm.add (2); nm.add (1); nm.print (); System.out.println ("ลบรายการที่เชื่อมโยง (ลบ 3)"); nm.delnode (3); nm.print (); System.out.println ("ค้นหารายการที่เชื่อมโยง (ค้นหา 1)"); System.out.println (nm.findnode (1)); System.out.println ("รายการเชื่อมโยง (ค้นหา 10)"); System.out.println (nm.findnode (10)); System.out.println ("รายการอัปเดต (อัปเดต 1 ถึง 10)"); nm.updatenode (1, 10); nm.print (); System.out.println ("รายการแทรก (แทรก 20 ที่ตำแหน่งแรก)"); NM.Insert (1, 20); nm.print (); System.out.println ("รายการแทรก (แทรก 30 ที่ตำแหน่งแรก)"); NM.Insert (1, 20); nm.print (); System.out.println ("รายการแทรก (แทรก 30 ที่ตำแหน่งศูนย์)"); nm.insert (0, 30); nm.print (); -รวบรวมและเรียกใช้รหัสผลลัพธ์มีดังนี้:
ฉันใช้ความรู้มากมายเกี่ยวกับโครงสร้างข้อมูลในคลาสคอลเลกชันใน Java เมื่อฉันอยู่ในสภาพดีฉันจะเรียนรู้ซอร์สโค้ดของคลาสคอลเลกชัน Java ฉันจะทำงานอย่างหนักเพื่อเป็นโปรแกรมเมอร์จูเนียร์!
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com