เหตุใดเขาจึงไม่ใช้โค้ดต่อไปนี้ในการแทรกโหนดที่ตำแหน่งเฉพาะในรายการที่เชื่อมโยง

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

Node InsertNth(Node head, int data, int position) {
    Node newNode = new Node();
    newNode.data = data;

    if(head==null){
        newNode.next = head;
        return newNode;
    }
    Node first = head;

    while(position > 0 && head.next!=null){
        head = head.next;
        position -= 1;
    }

    newNode.next = head;
    head = newNode;
    return first;

}

person आनंद    schedule 09.11.2016    source แหล่งที่มา
comment
ปัญหาทั้งหมดอยู่ใน 3 บรรทัดสุดท้าย คุณไม่เคยกำหนด newNode ให้กับสิ่งใดๆ ที่เป็น next   -  person 4castle    schedule 09.11.2016


คำตอบ (1)


ใช่ มีบางอย่างผิดปกติ หลังการวนซ้ำ while คุณกำลังพยายามแทรก newNode ก่อน head แต่วิธีนี้ไม่ได้ผล บรรทัด head=newNode; ไม่มีประโยชน์

คุณอาจต้องการตัวชี้อื่นเพื่อชี้ไปที่โหนดก่อน head เพื่อให้คุณสามารถแทรก newNode ระหว่างตัวชี้ทั้งสองนี้ หรือคุณต้องหยุดการวนซ้ำ while หนึ่งขั้นตอนก่อนหน้า และแทรก newNode หลัง head นี่คือวิธีแก้ปัญหาที่สอง:

 while(position > 1 && head.next!=null){ //0 is replaced by 1 here
    head = head.next;
    position -= 1;
}

newNode.next = head.next;
head.next = newNode;
return first;

[แก้ไข]

ในโซลูชันนี้ คุณต้องจัดการกรณีพิเศษเมื่อ position เท่ากับ 0 โดยการเพิ่มโค้ดต่อไปนี้ก่อนลูป while:

if(position==0) {
    newNode.next = head.next;
    return newNode;
}
person AhmadWabbi    schedule 09.11.2016
comment
ขอบคุณ จะเกิดอะไรขึ้นถ้าตำแหน่งเป็น 0 หรือ 1? มันใช้งานไม่ได้ - person आनंद; 09.11.2016
comment
ตำแหน่ง 1 ทำงานได้ดี: ลูปไม่วนซ้ำเลยและ newNode จะถูกแทรกหลังจาก head ซึ่งเป็นตำแหน่งที่ถูกต้อง 1 สำหรับตำแหน่ง 0 คุณพูดถูก มันไม่ทำงาน คุณต้องเพิ่มกรณีพิเศษลงไป ฉันจะแก้ไขคำตอบตามนั้น - person AhmadWabbi; 09.11.2016