java学习之数据结构:二、链表

本节介绍链表

目录

1.什么是链表

1.1链表定义

1.2链表分类

2.链表实现

2.1创建链表

1)手动创建

2)创建链表类进行管理链表的相关操作

2.2添加元素

1)头插法

2)尾插法

3)任意位置插入

2.3删除

2.4查找

1)返回节点

2)返回索引


1.什么是链表

1.1链表定义

链表是一种数据结构,它由一系列节点组成。每个节点包含至少两部分信息:数据域(用于存储数据元素)和指针域(用于存储指向下一个节点的引用或地址)。链表通过节点之间的指针连接,形成一个链式结构。

与数组不同:1.数组中的元素在内存中是连续存储的,而链表的节点在内存中的存储位置不一定是连续的。2.链表它在插入和删除操作上相对数组更加灵活

1.2链表分类

  • 单向链表:也称为单链表,是最基本的链表形式。每个节点只包含一个指向下一个节点的指针,只能从链表的头节点开始,沿着指针依次访问后续节点,无法反向遍历。
  • 双向链表:在双向链表中,每个节点除了有一个指向后继节点的指针外,还有一个指向前驱节点的指针。这使得双向链表可以在两个方向上进行遍历,既可以从头节点向后遍历,也可以从尾节点向前遍历。
  • 循环链表:循环链表又分为单向循环链表和双向循环链表。单向循环链表的尾节点的指针指向头节点,形成一个环形结构,这样可以从任意一个节点出发,遍历整个链表。双向循环链表则是头节点的前驱指针指向尾节点,尾节点的后继指针指向头节点,同样实现了环形的结构,提供了更灵活的遍历方式。

2.链表实现

2.1创建链表

1)手动创建

即自己创建一个node类然后调用

package com.qcby;

public class Node {
    Node next;
    int value;

    public static void main(String[] args) {
        Node node1 = new Node();
        node1.value = 1;
        Node node2 = new Node();
        node2.value = 2;
        node1.next = node2;
        System.out.println(node1.value);
        System.out.println(node1.toString());
    }
    public String toString() {
        return "Node[" +
                "next=" + next +
                ", value=" + value +
                ']';
    }
}

2)创建链表类进行管理链表的相关操作

使用 LinkList list = new LinkList(); 创建链表

2.2添加元素

1)头插法

头插法就是每次有一个新的元素进入链表时,将新节点插入到链表的头部,使其成为新的头节点。

代码如下:

	public void addHead(int value) {
		Node node=new Node(value);
		if(head==null) {
			head=node;
			return;
		}
		node.next=head;
		head=node;
		
	}

2)尾插法

当每次链表接受新的元素时,将新节点插入到链表的尾部,使其成为新的尾节点。

代码如下:

public void add(int data) {
        Node node = new Node();
        node.value = data;
        if (head == null) {
            head = node;
        } else {
            Node temp = head;
            while (temp.next != null) {
                temp = temp.next;
            }
            temp.next = node;
        }
    }

3)任意位置插入

在接收到新元素时,给新元素的位置做规定,即任意位置插入是将新节点插入到链表的指定位置。

代码:

public void addIndex(int index, int data) {
        Node node = new Node();
        node.value = data;
        if (index < 0 || index > getLength()) {
            System.out.println("超出范围");
            return;
        }
        if (index == 0) {
            addHead(data);
        } else {
            Node temp = head;
            for (int i = 0; i < index - 1; i++) {
                temp = temp.next;
            }
            node.next = temp.next;
            temp.next = node;
        }
    }

注意:想要实现任意位置插入,需要关注其链表长度,防止该插入位置比链表长度大出现问题

即实现一个求解长度的类,主要是通过遍历链表节点来记录长度:

    public int getLength() {
        int length = 0;
        Node temp = head;
        while (temp != null) {
            length++;
            temp = temp.next;
        }
        return length;
    }

2.3删除

public void remove(int data) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        if (head.value == data) {
            head = head.next;
            return;
        }
        Node temp = head;
        while (temp.next != null) {
            if (temp.next.value == data) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
    }

2.4查找

1)返回节点

    public Node find(int data) {
        Node temp = head;
        while (temp != null) {
            if (temp.value == data) {
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }

2)返回索引

    public int findIndex(int data) {
        Node temp = head;
        int index = 0;
        while (temp != null) {
            if (temp.value == data) {
                return index;
            }
            temp = temp.next;
            index++;
        }
        return -1;
    }

你可能感兴趣的:(java学习,数据结构,java,学习)