การสลับสองโหนดที่อยู่ติดกันในรายการที่เชื่อมโยง java

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

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

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();
}

นี่คือวิธีทดสอบของฉัน โดยสร้างรายการโหนด 7 รายการ และพิมพ์ลงหน้าจอ

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());
}

นี่คือผลลัพธ์ที่ฉันได้รับ:

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

12

8

14

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

ผลลัพธ์ที่ต้องการจะเป็น:

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

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


person Mattonio    schedule 12.07.2018    source แหล่งที่มา
comment
หากเป็นไปได้ให้โพสต์รหัสสำหรับคลาส SLL และ Target ฉันเห็นว่าคุณใช้ cursor.link บางครั้งและ cursor.getLink() ครั้งอื่นๆ ดังนั้นจึงไม่มีความชัดเจนเกี่ยวกับพฤติกรรมที่เฉพาะเจาะจง   -  person lealceldeiro    schedule 12.07.2018
comment
ตัวสร้าง: SLL สาธารณะ (int InitialData, SLL InitialLink) { head = this; ข้อมูล = ข้อมูลเริ่มต้น; ลิงค์ = ลิงค์เริ่มต้น; } ลิงก์ทั้งหมดควรเป็น .link เพราะ .getLink() ทำให้ฉันยุ่งวุ่นวายตอนที่มันใช้งานไม่ได้ ทุกอย่างอยู่ในคลาสเดียว   -  person Mattonio    schedule 13.07.2018


คำตอบ (1)


ดูเหมือนว่าคุณกำลังพยายามสลับโหนดเฉพาะ (กำหนดโดยค่าของโหนด) กับโหนดหลังจากนั้น

วิธีแก้ไขปัญหาที่ง่ายที่สุดที่คุณนำเสนอคือเพียงแค่สลับค่า แทนที่จะพยายามสลับโหนด

สิ่งนี้น่าจะได้ผลเนื่องจากคุณกำลังเผชิญกับสิ่งดั้งเดิม

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);
}

เพียงต้องแน่ใจว่าได้จัดการกับกรณีที่ค่าเป้าหมายของคุณอยู่ในโหนดสุดท้ายในรายการ

แก้ไข- เนื่องจากด้วยเหตุผลบางอย่างที่คุณต้องการเปลี่ยนลิงก์แทน ตรรกะทั่วไปคือ-

  • ติดตาม 3 โหนด: ก่อนหน้า ปัจจุบัน ถัดไป
  • ตั้ง prev.link = ถัดไป
  • ตั้งค่า current.link = next.link
  • ตั้งค่า next.link = ปัจจุบัน
person Orch    schedule 12.07.2018
comment
ใช่ ฉันกำลังพยายามสลับโหนดตามมูลค่าของโหนด คำถามของฉันคือทำอย่างไรโดยเปลี่ยนเฉพาะลิงก์แทนที่จะเปลี่ยนค่า - person Mattonio; 12.07.2018
comment
@Orch ยังมี break; ในคำสั่ง if ที่จำเป็น มิฉะนั้นค่าเป้าหมายจะถูกย้ายไปยังส่วนท้ายของรายการ - person Jorj; 12.07.2018
comment
@Mattonio นี่เป็นคำถามการบ้านหรือเปล่า? เหตุผลที่คุณไม่สามารถสลับค่าคืออะไร? - person Orch; 12.07.2018
comment
@Orch แม้ว่าจะไม่ใช่คำถามการบ้าน แต่วิธีนั้นก็ไม่ได้ดีนัก จะเกิดอะไรขึ้นถ้าโหนดถูกขยายให้มีมากกว่าหนึ่งฟิลด์? จากนั้นคุณจะต้องเปลี่ยนเมธอด swap ทุกครั้งที่คลาส node เปลี่ยนแปลงหรือขยายออกไป - person mypetlion; 12.07.2018
comment
@mypetlion คำตอบของฉันขึ้นอยู่กับคำถามที่ถูกถาม หากคุณเปลี่ยนคำถาม คำตอบก็อาจจะเปลี่ยนไปเช่นกัน ซึ่งดูเหมือนชัดเจน - person Orch; 12.07.2018
comment
นี่คือแบบฝึกหัดจากตำราเรียน โครงสร้างข้อมูลแบบเปิด วัตถุประสงค์คือเพื่อเปรียบเทียบประสิทธิภาพระหว่างการสลับในรายการที่เชื่อมโยงแบบเดี่ยวและแบบทวีคูณ - person Mattonio; 13.07.2018
comment
นี่ควรตอบคำถามของคุณ ขณะนี้วิธีที่คุณตั้งค่าลิงก์ไม่ถูกต้อง - person Orch; 13.07.2018