链表算法

时间:2018-06-23 17:09:00

标签: java algorithm

这是LinkedList算法的实现。算法在初学者,给定节点之后或列表末尾插入节点。

package LinkedList;

class LinkedList {
    Node Head;

    class Node {
        int data;
        Node Next;

        public Node(int d) {
            data = d;
            Next = null;
        }
    }

    public void insert(int value) {
        if (Head ==null) {
            Head = new Node(value);
            return;
        }
        Node new_node = new Node(value);
        new_node.Next = Head;
        Head = new_node;
    }

    public void display() {
        Node a = Head; 
        while (a != null) {
            System.out.println("value:" + a.data);
            a = a.Next;
        }
    }

    public void insertMiddle(int valueToInsert, Node prev_node) {
        if (Head == null) {
            System.out.println("Cant put value after last node");
        }
        Node new_node = new Node(valueToInsert);
        new_node.Next = prev_node.Next;
        prev_node.Next = new_node;
    }

    public void last(int value){
            Node new_node = new Node(value);
        if(Head == null){
            Head = new Node(value);
            return;
        }
        new_node.Next = null;

        Node last = Head;
        while(last != null){
            last = last.Next ;
        }
        last = new_node;
            return;
    }
}

public class LinkedList_Insertion {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedList list = new LinkedList();
        list.insert(8);
        list.insert(20);
        list.insert(0);
        list.insertMiddle(999, list.Head.Next);
        list.display();
        System.out.println("--------------");
        list.last(10000);
        list.display();
    }
}

在上面的代码中,在使用方法插入时:

public void insert(int value) {
    if(Head ==null){
        Head = new Node(value);
        return;
    }
    Node new_node = new Node(value);
    new_node.Next = Head;
    Head = new_node;
}

我们为什么不使用Head.next = new_node;

类似地,对于方法:

public void last(int value){
    Node new_node = new Node(value);
    if(Head == null){
        Head = new Node(value);
        return;
    }
    new_node.Next = null;

    Node last = Head;
    while(last != null){
        last = last.Next ;
    }
    last = new_node;
    return;
}

我们为什么不使用last.next = new_node;

我经常一次又一次地犯同样的错误。如果有人能清除这个概念,我将不胜感激。
期待你的回复!

2 个答案:

答案 0 :(得分:2)

您的第二个密码似乎是错误的,您是正确的,它必须为last.next = newNode 现在回答您的第一个问题,请考虑链接列表100(head),200,300中的3个数字。 在这里,值为100的头节点指向值为200的下一个节点,该节点又必须指向值为300的节点。现在让我们假设您要在100之前插入50,所以当您这样做

Head.next = new_node; 

使值为100的节点指向值为50的下一个节点,因此现在链表中的链结数为100,50,头仍为100,这是错误的 所以我们做

new_node.Next = Head;
Head = new_node;

在这种情况下,链接列表变为50,100,200,300。 因此,我们这样做。

答案 1 :(得分:1)

头套:

您可以拥有Head-> node1-> node2-> node3-> ...-> lastNode

如果您执行Head.next = newNode,则node1-> node2-> node3-> ...-> lastNode将丢失。

如果您有一个双向链接列表,则可以进行Head.prev = newNode; Head = Head.prev(上一个表示上一个)。

最后一种情况:

此代码:

public void last(int value){
    Node new_node = new Node(value);
    if(Head == null){
        Head = new Node(value);
        return;
    }
    new_node.Next = null;

    Node last = Head;
    while(last != null){
        last = last.Next ;
    }
    last = new_node;
    return;
}

看起来很奇怪,条件实际上应该是while (last.next != null),但是即使您没有插入,也要先获得对列表中最后一个元素的引用,然后将该引用指向另一个对象,它应该实际上是last.next = newNode,您是正确的。

实施链表是了解Java引用如何工作,继续练习并尝试实现双链表的好方法。