该部分主要针对两部分内容进行总结,提出自己的理解,巩固知识点,完成变式训练
1.链表增加、删除元素(首部、中部、尾部)
无论是链表的插入还是删除,最重要的逻辑是找到待插入(删除)元素的前驱节点,然后编写插入删除元素的逻辑即可。
令人振奋的是,找到前驱节点有相应的模板供我们学习,我们假设待删除元素的位置是pos(位置从1开始),前驱节点的寻找模板(中部、尾部)如下:
int count = 1;
Node pNode = head;
while(count < pos - 1){
pNode = pNode.next;
count++;
}
经过该模板,pNode就是我们找寻的前驱节点!
当然我们没有考虑特殊情况!!(在首部[插入/删除]元素),特殊情况特殊记忆就行!直接代码!
变式训练
题目要求:在递增链表中插入新元素
如何理解这个题目?怎么应用上面的知识点?以下是我的思考
这个题目属于链表范围内的,无外乎增删改查,那么我们直接使用上面的方法,关键在于找到前驱节点!先遍历链表找到待插入位置pos,然后按照模板找前驱节点,插入元素就行!
int pos = 1;
Node pNode = head;
while(pNode != null){
if(pNode.data > nodeInsert.data){
break;
}
pos++;
pNode = pNode.next;
}
2.双向链表增加、删除元素(首部、中部、尾部)
事先规定双向链表的数据结构,以便厘清思路!
//链表
public class DoublyLinkList {
//头节点,尾节点
private DoubleNode first;
private DoubleNode last;
public DoublyLinkList() {
first = null;
last = first;
}
//节点
class DoubleNode{
public int data;//数据域
public DoubleNode next;//前驱
public DoubleNode prev;//后继
public DoubleNode(int data) {
this.data = data;
}
}
//定义相关方法...(增删改查)
}
该图来自于骨头哥哈
无论增加元素还是删除元素,关键在于如何连线!关键在于厘清newDoubleNode和current之间的位置(逻辑)关系!
2.1增加元素
我们首先构建箭头所指的线段(注意,图中current和所构建的线段的位置[我暂且用“镜像位置”来形容]),那么直接上代码(以图2位置为例)!
//先构建箭头所指的线段
current.next.prev = newDouleNode;
newDoubleNode.next = current.next;
//其余逻辑
current.next = newDoubleNode;
newDoubleNode.prev = current;
首部尾部增加元素怎么办?立即推:特殊情况特殊记忆!直接上代码哈
//首部元素添加
first.prev = newDoubleNode;
newDoubleNode.next = first;
first = newDoubleNode;
//尾部元素添加
last.next = newDoubleNode;
newDouble.prev = last;
last = newDoubleNode;
2.2删除元素
对于待删除元素current,我们直接修改这个节点的入边(好像current被针对了)。简称“先搞针对”,代码!
current.prev.next = current.next;
current.next.prev = current.prev;
首部尾部删除元素怎么办?立即推:幻听(特殊情况特殊记忆!)直接上代码哈
//首部删除
first.next.prev = null;
first = first.next;
//尾部删除
last.prev.next = null;
last = last.prev;
Ok,《算法通关村第一关——链表青铜挑战笔记》结束,喜欢的朋友三联加关注!关注鱼市带给你不一样的算法小感悟!(幻听)
再次,感谢鱼骨头教官的学习路线!鱼皮的宣传!小y...emmm还没想好,ok,拜拜,第一关第二幕见!