链表列表

一、链表列表在存储方式上和数组列表的不同
  链表列表的存储空间不连续。更有效利用了碎片化的存储空间。
  
二、什么是链表列表
  链表列表由节点组成,每个节点上有存储的数据和下一个节点的地址,最后一个节点的指向下一个节点为null


三、定义链表列表
  1.定义一个节点类,有数据和下一个节点两个属性
public class Node<E> {
private E data;
private Node<E> next;

public Node(E data){
this.data = data;
}
}
  2.定义链表列表的可操作方法,通常至少拥有增加元素、删除元素、修改元素、查找元素方法
链表有头结点、尾节点、长度三个属性
(1).增加元素、创建一个新的节点对象,如果链表为空,把新节点设为头节点,不为空就把尾节点的下一个节点指向新节点,并把新节点设置为尾节点,长度加一。
(2).删除元素、将要删除元素的前一个节点的下一个节点指向要删除元素的后一个节点,长度减一。
(3).修改元素、查找到位置,将节点的数据属性修改为新数据
(4).查找元素、return (E) node.getData();


四、数组列表和链表列表的对比
  1.对于查询、修改,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
  2.对于新增、删除,LinedList比较占优势,因为ArrayList要移动数据。 
合并两个有序链表是将两个已排序的链表合并成一个新的有序链表,新链表中的元素保持原有的排序关系,在数据库合并、文件排序等领域有广泛应用。以下介绍两种常见的合并方法: ### 迭代法 迭代法的核心思路是创建一个虚拟头节点,通过比较两个链表当前节点的值,依次选择较小值的节点添加到新链表中,直到其中一个链表遍历完,最后将另一个未遍历完的链表直接连接到新链表末尾。 以下是 JavaScript 实现代码: ```javascript /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function(l1, l2) { const prehead = new ListNode(); let cur = prehead; while (l1 != null && l2 != null) { if (l1.val < l2.val) { cur.next = l1; l1 = l1.next; } else { cur.next = l2; l2 = l2.next; } cur = cur.next; } cur.next = l1 == null ? l2 : l1; return prehead.next; }; ``` 在上述代码中,`prehead` 是虚拟头节点,`cur` 用于遍历新链表。在循环中,不断比较 `l1` 和 `l2` 的值,将较小值的节点连接到 `cur` 后面,并移动相应链表的指针。循环结束后,将未遍历完的链表直接连接到 `cur` 后面,最后返回 `prehead.next` 即为合并后的链表头节点 [^1][^4]。 ### 递归法 递归法的核心思想是先处理特殊情况,即如果其中一个链表为空,则直接返回另一个链表。然后比较两个链表当前节点的值,选择较小值的节点作为合并后链表的当前节点,并递归地合并该节点的下一个节点和另一个链表,将递归结果作为当前节点的下一个节点。 以下是 C 语言实现代码: ```c #include <stdio.h> #include <stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { // 如果l1为空,则直接返回l2作为合并后的链表 if (l1 == NULL) { return l2; } // 如果l2为空,则直接返回l1作为合并后的链表 else if (l2 == NULL) { return l1; } // 如果l1的值小于l2的值 else if (l1->val < l2->val) { // 将l1的下一个节点与l2递归地合并 l1->next = mergeTwoLists(l1->next, l2); return l1; // 返回合并后的链表头节点l1 } // 如果l2的值小于等于l1的值 else { // 将l2的下一个节点与l1递归地合并 l2->next = mergeTwoLists(l1, l2->next); return l2; // 返回合并后的链表头节点l2 } } ``` 在上述代码中,首先判断 `l1` 和 `l2` 是否为空,如果其中一个为空则直接返回另一个链表。然后比较 `l1` 和 `l2` 的值,选择较小值的节点作为当前节点,并递归调用 `mergeTwoLists` 函数合并该节点的下一个节点和另一个链表,最后返回当前节点 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值