在链表JAVA的特定位置插入节点

问题描述 投票:0回答:5
public static SinglyLinkedListNode insertNodeAtPosition(SinglyLinkedListNode llist, int data, int position) {
    if(llist == null) {
        llist =  new SinglyLinkedListNode(data);
        return llist;
    } else {
        for (int i = 0; i < position-1; i++) {
            llist = llist.next;
        }
        SinglyLinkedListNode temp = llist;
        llist.next = new SinglyLinkedListNode(data);
        llist = llist.next;
        llist.next = temp.next;         
        return llist;
    }
}

这是我在 LinkedList 中放置自定义索引节点的代码。但 hackerrank 不接受我的代码。我的算法有什么问题吗?

java algorithm linked-list singly-linked-list
5个回答
0
投票
问题是你的代码总是返回新创建的节点,但你应该始终返回列表中的第一个节点,它要么是你获得它时的节点,要么是新节点(如果位置为零) .

看什么:

我不会提供更正后的代码,但会给你两个提示:

通过在

llist

循环中向前移动

for

,您将丢失对第一个节点的引用,因此请使用不同的变量来遍历列表。
此外,您应该专门处理 
position

为 0 的情况,因为这是唯一一种返回值不是原始

llist

 值,而是新节点的引用的情况,就像在 
if 中一样
 块。

最简单的解决方案无需解释: 解决方案:

0
投票
static SinglyLinkedListNode insertNodeAtPosition(SinglyLinkedListNode head, int data, int position) { if (head == null) return null; SinglyLinkedListNode temp = new SinglyLinkedListNode(data); if (position == 0) { temp.next = head; return temp; } SinglyLinkedListNode p = head; for (int i = 0; i< position-1; i++) { p = p.next; } SinglyLinkedListNode next = p.next; p.next = temp; temp.next = next; return head; }

问题要求你返回一个链表。当我们被要求返回一个链表时,实际上我们返回的是链表的第一个节点。

0
投票
所以,你的问题是代码脚本中的返回值不是链表的第一个节点。

最简单的解决方案是将第一个节点保留在另一个变量中,并且

完成插入操作后返回该变量。 例如:

SinglyLinkedListNode dumyNode = llist; ...... return dumyNode;

假设给定了正确的 Node 类,您可以尝试这种方法(没有索引冲突的情况):

0
投票
private Node find(int index) { Node curr = head; for (int i = 0; i < index; i++) curr = curr.next; return curr; } // end find() public Object get(int index) throws IndexOutOfBoundsException { if (index >= 0 && index < size) { Node curr = find(index); return curr.data; } else { throw new IndexOutOfBoundsException(); } // end if - else } // end get() public void add(Object data, int index) throws IndexOutOfBoundsException { if (index >= 0 && index < size + 1) { if (index == 0) head = new Node(data); else { Node prev = find(index - 1); prev.next = new Node(data); } // end if - else size++; } else { throw new IndexOutOfBoundsException(); } // end if - else } // end add()

单链表默认插入值并按位置

0
投票
public class Main { private Node head; public void insert(int data,int position){ Node newNode=new Node(data); if(head==null){ head=newNode; return; } Node current=head; int counter=0; boolean flag=true; while(current.next!=null){ if(counter==position){ current.data=data; flag=false; } current=current.next; counter++; } if(flag) { current.next=newNode; } } public void insert(int data){ Node newNode=new Node(data); if(head==null){ head=newNode; return; } Node current=head; while(current.next!=null){ current=current.next; } current.next=newNode; } public void display(){ Node current=head; while(current!=null){ System.out.println(current.data); current=current.next; } } public static void main(String[] args) { System.out.println("Try programiz.pro"); Main obj=new Main(); obj.insert(10); obj.insert(20); obj.insert(30); obj.insert(40); obj.insert(70,4); obj.display(); } } class Node{ int data; Node next; Node(int data){ this.data=data; this.next=null; } }

10 20 30 40 70
    

© www.soinside.com 2019 - 2024. All rights reserved.