欢迎访问宙启技术站
智能推送

学习Java函数实现链表(LinkedList)数据结构的相关操作?

发布时间:2023-05-21 23:48:32

Java是一门很好的编程语言,它十分常用,尤其是在面向对象编程(OOP)中。在OOP中,有一种很常见的数据结构,即链表(LinkedList),它可以帮助程序员很好地组织和管理数据。在Java中,可以通过实现自定义函数来实现链表数据结构的相关操作,下面我们就来学习一下实现链表的常用函数。

1. 创建链表

链表是由节点组成的序列,每个节点包含两个部分:数据和指针。指针指向下一个节点。因此,创建一个链表,就需要定义一个节点类,并编写一个初始化链表的函数。

链表节点类定义:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { 
        val = x; 
        next = null;
    }
}

链表初始化函数:

public ListNode createLinkedList(int[] arr) {
    ListNode head = null;   // 头节点
    ListNode tail = null;   // 尾节点
    for (int i = 0; i < arr.length; i++) {
        ListNode node = new ListNode(arr[i]);
        if (head == null) {    // 如果链表没有节点,即      个节点
            head = node;
            tail = node;
        } else {    // 如果链表已经有节点,即不是      个节点
            tail.next = node;
            tail = node;
        }
    }
    return head;
}

2. 遍历链表

遍历链表,就是按顺序输出链表中的所有节点数据。可以通过循环遍历链表中的每个节点,并输出该节点的数据。

public void printLinkedList(ListNode head) {
    ListNode p = head;
    while (p != null) {
        System.out.print(p.val + " ");
        p = p.next;
    }
}

3. 计算链表长度

计算链表长度,就是计算链表中有多少个节点。可以通过循环遍历链表中的每个节点,并记录节点的个数。

public int getLinkedListLength(ListNode head) {
    ListNode p = head;
    int count = 0;
    while (p != null) {
        count++;
        p = p.next;
    }
    return count;
}

4. 单链表反转

单链表反转,就是将链表中的每个节点指针方向反转。可以通过循环遍历链表中的每个节点,并将节点的指针方向改为前一个节点。

public ListNode reverseLinkedList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode nextTemp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

5. 删除链表中的节点

删除链表中的节点,就是将链表中指定位置的节点删除。可以通过遍历链表,找到要删除的节点,并将该节点的前一个节点指向当前节点的下一个节点。

public ListNode deleteNode(ListNode head, int val) {
    ListNode dummy = new ListNode(0);   // 设置一个哑节点,方便操作首节点
    dummy.next = head;
    ListNode p = dummy;
    while (p.next != null) {
        if (p.next.val == val) {
            p.next = p.next.next;
        } else {
            p = p.next;
        }
    }
    return dummy.next;
}

6. 链表排序

链表排序,就是将链表中的节点按照指定的规则排序。可以通过遍历链表,将链表中的节点保存到相应的数据结构中,并按照指定的规则排序后,再重新建立连接。

public ListNode sortLinkedList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    ListNode mid = slow.next;
    slow.next = null;
    ListNode left = sortLinkedList(head);
    ListNode right = sortLinkedList(mid);
    return merge(left, right);
}

private ListNode merge(ListNode l1, ListNode l2) {
    ListNode dummy = new ListNode(0);
    ListNode p = dummy;
    while (l1 != null && l2 != null) {
        if (l1.val < l2.val) {
            p.next = l1;
            l1 = l1.next;
        } else {
            p.next = l2;
            l2 = l2.next;
        }
        p = p.next;
    }
    if (l1 != null) {
        p.next = l1;
    } else {
        p.next = l2;
    }
    return dummy.next;
}

以上是实现链表数据结构的相关常用操作的代码示例。希望通过学习这些代码,您能够更好地理解链表数据结构的实现方法,并进一步提高自己的编程水平。