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