算法通关村第一关——链表青铜挑战笔记

该部分主要针对两部分内容进行总结,提出自己的理解,巩固知识点,完成变式训练

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,拜拜,第一关第二幕见!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值