作者:hacker发布时间:2022-11-29分类:网络黑客浏览:121评论:3
举一个现实中的例子你就明白了:
假设有apcde5个小朋友依次手拉着手组成了一个链表a-p-c-d-e,现在来了一个小朋友q,老师要他插到p的后面,如果他只拉着p的手,而不拉着c的手,那链表是不是就断了,变成了两个链表a-p-q和c-d-e。
所以,这里的q-next=p-next;的意思就相当于让q的一只手先拉着c的一只手(此时的c一只手拉着p和q,另一只手拉着d),而p-next=q;的意思就相当于让p松开与c的手转而拉着q的另一只手,这样就形成了一个完整的链表。
当然,在现实中q和p、c中的谁先拉手是不重要的,但对于链表,q必须先和c拉手,因为只有通过p-next才能找到c,如果q先和p拉手(即执行p-next=q;),那链表就断了,再也没有办法找到c了(因为现在的p-next是q而不是c了,也没有其它指针指向c)。
总之记住,在链表中插入一个结点时顺序很重要,是先连后断。
比如,要将x插在p和q之间,必须先令x和q连接起来,然后断开原来的p和q之间的连接,转而令p和x建立连接。
首先要了解链表的数据结构,单链表一般由数据内容和一个指针组成,你的代码就是一个单链表,data定义了一个结构(delphi叫做记录),它包含一个ingteger型的变量num,next是指针,他指向下个一链表节点,你可以通过第一个链表节点的next指针,一个一个的遍历后面的元素,来访问每个节点的内容。 链表的好处是,由于动态创建每个节点,占用空间比数组要小,但是查询速度要比数组慢一些,不过在节点数量小的情况下,速度可以忽略不计。 建议你学习一些数据结构的知识,链表除了单链表外,还有双链表等,除了链表外还有其它很多数据结构,都是很有用的。
你可能对链表的数据结构并不是很清楚 给你个写示例代码理解下,最好打个断点每一步跟踪理解一下
//class ListNode {
// int val;
// jdb.ListNode next;
// ListNode(int x) { val = x; }
//}
public class Main {
public static void main(String[] args) throws Exception {
//现在有一个链表1-2-3
ListNode listNode = new ListNode(1);
listNode.next = new ListNode(2);
listNode.next.next = new ListNode(3);
listNode.next.next.next = new ListNode(4);
//我们来打印一下
printListNode(listNode);
//我现在要在2后面插入9
boolean flag = insertVal(listNode, 3, 9);
System.out.println("是否插入成功:"+flag);
//再来打印一下
printListNode(listNode);
}
/**
*
* @param listNode//原链表
* @param pre//插入前的位置
* @param val//插入的值
*/
public static boolean insertVal(ListNode listNode,Integer pre, Integer val) {
boolean rs = false;
//找插入前的位置
while (listNode != null listNode.val != pre) {
listNode = listNode.next;
}
if (listNode != null listNode.val==pre) {
//找到啦
//先把原链表后的数据保存起来 这边就是3-4
ListNode temp = listNode.next;
//把要插入的值连上,再把原来保存的值连上
listNode.next = new ListNode(val);
listNode.next.next = temp;
//上面代码中 listNode的值是2,listNode.next的值是9,listNode.next.next的值就是刚才保存的临时链表3-4
//插入成功标记一下哦
rs=true;
}
return rs;
}
/**
* 打印呀
* @param listNode
*/
public static void printListNode(ListNode listNode) {
if (listNode != null) {
ListNode temp = listNode;
while (temp != null) {
System.out.println(temp.val);
temp = temp.next;
}
}
System.out.println("-------------");
}
}
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
1链表操作编辑
双向链表
双向链表
线性表的双向链表存储结构:
带头结点的双向循环链表的基本操作:
销毁双向循环链表L:
重置链表为空表:
验证是否为空表:
2元素操作编辑
计算表内元素个数
赋值:
查找元素:
查找元素前驱:
查找元素后继:
查找元素地址:
元素的插入:
元素的删除:
正序查找:
逆序查找:
3循环链表编辑
循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
标签:单链表指定位置添加的原理
已有3位网友发表了看法:
访客 评论于 2022-11-29 23:46:44 回复
表外,还有双链表等,除了链表外还有其它很多数据结构,都是很有用的。Java中单向链表怎么将节点插入到指定位置?你可能对链表的数据结构并不是很清楚 给你个写示例代码理解下,最好打个断点每一步跟踪理解一下//class ListNode {// i
访客 评论于 2022-11-30 08:20:15 回复
rgs) throws Exception { //现在有一个链表1-2-3 ListNode listNode = new ListNode(1); listNode.next = new ListNode
访客 评论于 2022-11-30 06:31:53 回复
if (listNode != null) { ListNode temp = listNode; while (temp != null) {