【Java】数据结构—— 单链表和双链表

一、单链表

前期准备:

1)创建一个学生结点

public class StudentNode {
    
    

    public int id;
    public int num;//学号
    public String name;//姓名
    public StudentNode next;//保存下一个结点

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

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

2)创建一个单链表

public class SingleLinkedList {
    
    
    
    private StudentNode head;
    /**
     * init a node of head
     * 初始化一个头节点
     */
    public SingleLinkedList( ) {
    
    
        head = new StudentNode(0, 0, "");
    }
    public StudentNode getHead() {
    
    
        return head;
    }

	"""""""""""
	
 }

1、添加结点

思路:

1.通过遍历找到指向空的结点(temp.next=null)
2.修改指针的指向,也就是让temp.next=null指向新的结点

看图说话:
在这里插入图片描述
代码:

public void add(StudentNode studentNode) {
    
    
        StudentNode temp = head;
        //while循环用于找到最后一个结点(null)
        while (true) {
    
    
            if (temp.next == null) {
    
    
                break;
            } else {
    
    
                temp = temp.next;//移动指针到下一个结点
            }
        }
        //studentNode 为新添加的结点
        temp.next = studentNode;
    }

2、遍历链表

思路:

1、获得头结点
2、定义一个变量作为临时变量
3、循环移动指针,知道为null停止

看图说话:
在这里插入图片描述

代码:

public void list() {
    
    
        if (head.next == null) {
    
    
            System.out.println("LinkedList is empty!");
            return;
        }
        StudentNode temp = head.next;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            } else {
    
    
                System.out.println(temp);
            }
            temp = temp.next;
        }
    }

3、修改结点

代码:

public void update(StudentNode studentNode) {
    
    
        if (head.next == null) {
    
    
            System.out.println("linkedList is empty!");
            return;
        }
        StudentNode temp = head.next;
        boolean flag = false;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            }
            if (temp.id == studentNode.id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.num = studentNode.num;
            temp.name = studentNode.name;
        } else {
    
    
            System.out.println("Can't find :" + studentNode.id + " node!");
        }
    }

4、删除结点

思路:

1.找到要删除结点的前一个结点。
2.修改指针的指向,将要修改结点的前一个结点指针指向后一个结点。

看图说话:
在这里插入图片描述

代码:

public void remove(int id) {
    
    
        StudentNode temp = head;
        boolean flag = false;
        while (true) {
    
    
            if (temp.next == null) {
    
    
                break;
            }
            if (temp.next.id == id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.next = temp.next.next;
        } else {
    
    
            System.out.println("Can't find the node for id!");
        }
    }

5、获取长度

思路:

将链表遍历一遍即可。

代码:

 public int getLength(StudentNode head) {
    
    
        if (head.next == null) {
    
    
            return 0;
        }
        int length = 0;
        StudentNode cur = head.next;
        while (cur != null) {
    
    
            length++;
            cur = cur.next;
        }
        return length;
    }

6、获取链表的倒数第N个结点

思路:

1.有多种方式:比如可以设置快慢指针可一遍就删除倒数第N个结点。
2.

看图说话:
代码:

public StudentNode getLastIndexNode(StudentNode head, int index) {
    
    
        if (head.next == null) {
    
    
            return null;
        }
        int size = getLength(head);
        if (index <= 0 || index > size) {
    
    
            return null;
        }
        StudentNode cur = head.next;
        for (int i = 0; i < size - index; i++) {
    
    
            cur = cur.next;
        }
        return cur;
    }

7、反转链表

代码:

public void reverseList(StudentNode head) {
    
    
        if (head.next == null || head.next.next == null) {
    
    
            return;
        }
        StudentNode cur = head.next;
        StudentNode next = null;
        StudentNode reverseHead = new StudentNode(0, 0, "");
        while (cur != null) {
    
    
            next = cur.next;
            cur.next = reverseHead.next;
            reverseHead.next = cur;
            cur = next;
        }
        head.next = reverseHead.next;
    }

8、反转打印链表

代码:

public void reversePrint(StudentNode head) {
    
    
        if (head.next == null) {
    
    
            return;
        }
        Stack<StudentNode> stack = new Stack<StudentNode>();
        StudentNode cur = head.next;
        while (cur != null) {
    
    
            stack.push(cur);
            cur = cur.next;
        }
        while (stack.size() > 0) {
    
    
            System.out.println(stack.pop());
        }

    }

9、按照编号有序添加结点

代码:

public void addByOrder(StudentNode studentNode) {
    
    
        //get a head node
        StudentNode temp = head;
        boolean flag = false;
        while (true) {
    
    
            if (temp.next == null) {
    
    
                break;
            }
            if (temp.next.id > studentNode.id) {
    
    
                break;
            } else if (temp.next.id == studentNode.id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            System.out.println(studentNode.id + "  is existed and can't add again!");
        } else {
    
    
            studentNode.next = temp.next;
            temp.next = studentNode;

        }

    }

10、在指定位置插入结点

在这里插入图片描述

二、双链表

双向链表介绍

前期准备:
1)创建一个学生结点

package com.qingfeng.linkedList.doubles;

class StudentNode {
    
    

    public int id;//序号
    public int num;//学号
    public String name;//姓名
    public StudentNode next;//保存下一个结点
    public StudentNode pre;//保存前一个结点

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

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

2)创建一个双向链表

public class DoubleLinkedList {
    
    
    /**
     * init a node of head
     */
    private StudentNode head;

    public DoubleLinkedList( ) {
    
    
        head = new StudentNode(0, 0, "");
    }

    public StudentNode getHead() {
    
    
        return head;
    }

				--------functions----------
}

1、添加结点

代码:

/**
     * create node of LinkedList
     *
     * @param studentNode
     */

    public void add(StudentNode studentNode) {
    
    
        StudentNode temp = head;
        while (true) {
    
    
            if (temp.next == null) {
    
    
                break;
            } else {
    
    
                temp = temp.next;

            }
        }
        temp.next = studentNode;
        /**
         * 1) temp.next.pre=temp;
         * 2) studentNode.pre=temp;
         */

        studentNode.pre = temp;
    }

2、修改结点

代码:

/**
     * update a node
     *
     * @param studentNode a student object
     */
    public void update(StudentNode studentNode) {
    
    
        if (head.next == null) {
    
    
            System.out.println("linkedList is empty!");
            return;
        }
        StudentNode temp = head.next;
        boolean flag = false;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            }
            if (temp.id == studentNode.id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.num = studentNode.num;
            temp.name = studentNode.name;
        } else {
    
    
            System.out.println("Can't find :" + studentNode.id + " node!");
        }
    }

3、删除结点

代码:

 /**
     * remove a node by id
     *
     * @param id
     */
    public void remove(int id) {
    
    
        StudentNode temp = head.next;
        boolean flag = false;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            }
            if (temp.id == id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.pre.next = temp.next;
            if (temp.next != null) {
    
    
                temp.next.pre = temp.pre;
            }


        } else {
    
    
            System.out.println("Can't find the node for id!");
        }
    }

4、遍历结点

代码:

/**
     * order the list
     */
    public void list() {
    
    
        if (head.next == null) {
    
    
            System.out.println("LinkedList is empty!");
            return;
        }

        StudentNode temp = head.next;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            } else {
    
    
                System.out.println(temp);
            }
            temp = temp.next;
        }
    }

完整代码

package com.qingfeng.linkedList.doubles;

public class DoubleLinkedList {
    
    
    /**
     * init a node of head
     */
    private StudentNode head;

    public DoubleLinkedList( ) {
    
    
        head = new StudentNode(0, 0, "");
    }

    public StudentNode getHead() {
    
    
        return head;
    }

    /**
     * create node of LinkedList
     *
     * @param studentNode
     */

    public void add(StudentNode studentNode) {
    
    
        StudentNode temp = head;
        while (true) {
    
    
            if (temp.next == null) {
    
    
                break;
            } else {
    
    
                temp = temp.next;

            }
        }
        temp.next = studentNode;
        /**
         * 1) temp.next.pre=temp;
         * 2) studentNode.pre=temp;
         */

        studentNode.pre = temp;
    }

    /**
     * update a node
     *
     * @param studentNode a student object
     */
    public void update(StudentNode studentNode) {
    
    
        if (head.next == null) {
    
    
            System.out.println("linkedList is empty!");
            return;
        }
        StudentNode temp = head.next;
        boolean flag = false;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            }
            if (temp.id == studentNode.id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.num = studentNode.num;
            temp.name = studentNode.name;
        } else {
    
    
            System.out.println("Can't find :" + studentNode.id + " node!");
        }
    }

    /**
     * remove a node by id
     *
     * @param id
     */
    public void remove(int id) {
    
    
        StudentNode temp = head.next;
        boolean flag = false;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            }
            if (temp.id == id) {
    
    
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
    
    
            temp.pre.next = temp.next;
            if (temp.next != null) {
    
    
                temp.next.pre = temp.pre;
            }


        } else {
    
    
            System.out.println("Can't find the node for id!");
        }
    }


    /**
     * order the list
     */
    public void list() {
    
    
        if (head.next == null) {
    
    
            System.out.println("LinkedList is empty!");
            return;
        }

        StudentNode temp = head.next;
        while (true) {
    
    
            if (temp == null) {
    
    
                break;
            } else {
    
    
                System.out.println(temp);
            }
            temp = temp.next;
        }
    }
}

测试代码

代码:

package com.qingfeng.linkedList.doubles;


/**
 * test
 */
@SuppressWarnings("all")
public class DoubleLinkedListDemo {
    
    
    public static void main(String[] args) {
    
    
        StudentNode node1 = new StudentNode(1, 2018010210, "liuxin");
        StudentNode node2 = new StudentNode(2, 2018010211, "yanghai");
        StudentNode node3 = new StudentNode(3, 2018010212, "huxiaotian");

        DoubleLinkedList linkedList = new DoubleLinkedList();
        linkedList.add(node1);
        linkedList.add(node2);
        linkedList.add(node3);
        /*------------------------------------------------------------------------*/
        System.out.println("-------testList-------");
        linkedList.list();
        /*------------------------------------------------------------------------*/
        System.out.println("-------testAdd-------");
        StudentNode node4 = new StudentNode(4, 2018010212, "guoyoudao");
        linkedList.add(node4);
        linkedList.list();
        /*------------------------------------------------------------------------*/
        System.out.println("-------testRemove----");
        linkedList.remove(3);
        linkedList.list();
        /*------------------------------------------------------------------------*/
        System.out.println("-------testUpdate-----");
        StudentNode update = new StudentNode(4, 2018010212, "xiaoming");
        linkedList.update(update);
        linkedList.list();

    }
}


运行结果:

-------testList-------
StudentNode{
    
    num=2018010210, name='liuxin'}
StudentNode{
    
    num=2018010211, name='yanghai'}
StudentNode{
    
    num=2018010212, name='huxiaotian'}
-------testAdd-------
StudentNode{
    
    num=2018010210, name='liuxin'}
StudentNode{
    
    num=2018010211, name='yanghai'}
StudentNode{
    
    num=2018010212, name='huxiaotian'}
StudentNode{
    
    num=2018010212, name='guoyoudao'}
-------testRemove----
StudentNode{
    
    num=2018010210, name='liuxin'}
StudentNode{
    
    num=2018010211, name='yanghai'}
StudentNode{
    
    num=2018010212, name='guoyoudao'}
-------testUpdate-----
StudentNode{
    
    num=2018010210, name='liuxin'}
StudentNode{
    
    num=2018010211, name='yanghai'}
StudentNode{
    
    num=2018010212, name='xiaoming'}

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/qq_43073558/article/details/107831427