单向链表 双向链表 java代码实现

单向链表

代码实现

package csdn.dreamzuora.list;

/**
 *  @author: weijie
 *  @Date: 2020/10/15 15:28
 *  @Description:
 */ 
public class SingleNode {
    int id;
    String name;
    SingleNode next;

    public SingleNode(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", next=" + next +
                '}';
    }
}
package csdn.dreamzuora.list;

/**
 * @Author weijie
 * @Date 2020/10/14 18:46
 * @Description 单向链表
 */
public class SingleLinkedList {

    /**
     * 无数据头结点
     */
    private SingleNode headNode = new SingleNode(0, "head");

    private SingleNode tailNode = headNode;


    /**
     * 尾插法:顺序
     * @param appendNode
     */
    public void tailAppend(SingleNode appendNode){
        tailNode.next = appendNode;
        tailNode = appendNode;
    }

    /**
     * 头插法:逆序
     * @param appendNode
     */
    public void headAppend(SingleNode appendNode){
        SingleNode childNode = headNode.next;
        if (childNode == null){
            tailNode.next = appendNode;
            tailNode = appendNode;
        }else {
            headNode.next = appendNode;
            appendNode.next = childNode;
        }
    }

    /**
     * 打印链表
     */
    public void show(){
        SingleNode childNode = headNode;
        while (childNode.next != null){
            SingleNode next = childNode.next;
            System.out.print("->" + next.name);
            childNode = next;
        }
    }

}


单元测试

package csdn.dreamzuora.list;

import org.junit.After;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * @Author weijie
 * @Date 2020/10/15 14:33
 * @Description
 */
public class SingleLinkedListTest {

    SingleLinkedList list = new SingleLinkedList();

    @Test
    public void tailAppend() {
        for (int i = 0; i < 10; i++){
            SingleNode appendNode = new SingleNode(i, "node-" + i);
            list.tailAppend(appendNode);
        }
    }

    @Test
    public void headAppend() {
        for (int i = 0; i < 10; i++){
            SingleNode appendNode = new SingleNode(i, "node-" + i);
            list.headAppend(appendNode);
        }
    }

    @After
    public void showList(){
        list.show();
    }
}

控制台打印

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

双向链表

代码实现

package csdn.dreamzuora.list;

/**
 * @Author weijie
 * @Date 2020/10/15 10:20
 * @Description
 */
public class DoubleNode {
    int id;
    String name;
    /**
     * 后继节点
     */
    DoubleNode next;

    /**
     * 前驱节点
     */
    DoubleNode last;

    public DoubleNode(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "DoubleNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

package csdn.dreamzuora.list;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author weijie
 * @Date 2020/10/15 10:19
 * @Description 双向链表
 */
public class DoubleLinkedList {

    /**
     * 无数据头节点
     */
    private DoubleNode headNode = new DoubleNode(0, "head");

    private DoubleNode tailNode = headNode;
    /**
     * 尾插法
     * @param appendNode
     */
    public void tailAppend(DoubleNode appendNode){
        tailNode.next = appendNode;
        appendNode.last = tailNode;
        tailNode = appendNode;
    }

    /**
     * 头插法
     * @param appendNode
     */
    public void headAppend(DoubleNode appendNode){
        DoubleNode childNode = headNode.next;
        if (childNode == null){
            headNode.next = appendNode;
            appendNode.last = headNode;
        }else {
            appendNode.next = childNode;
            appendNode.last = headNode;
            childNode.last = appendNode;
            headNode.next = appendNode;
        }
    }


    /**
     * 打印链表
     */
    public void show(){
        DoubleNode childNode = headNode;
        List<String> nextList = new ArrayList<String>();
        List<String> lastList = new ArrayList<String>();
        while (childNode.next != null){
            DoubleNode node = childNode.next;
            childNode = node;
            nextList.add("->" + node.name);
            DoubleNode nodeLast = childNode.last;
            lastList.add("<-" + nodeLast.name);
        }
        System.out.print("打印后继节点: ");
        nextList.forEach(elem -> System.out.print(elem));
        System.out.println();

        System.out.print("打印前驱节点: ");
        lastList.forEach(elem -> System.out.print(elem));
        System.out.println();
    }


}

单元测试

package csdn.dreamzuora.list;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * @Author weijie
 * @Date 2020/10/15 14:51
 * @Description
 */
public class DoubleLinkedListTest {

    DoubleLinkedList list = new DoubleLinkedList();

    @Test
    public void tailAppend() {
        for (int i = 0; i < 10; i++){
            list.tailAppend(new DoubleNode(i, "node-" + i));
        }
    }

    @Test
    public void headAppend() {
        for (int i = 0; i < 10; i++){
            list.headAppend(new DoubleNode(i, "node-" + i));
        }
    }

    @After
    public void showList(){
        list.show();
    }
}

控制台打印

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值