707.设计链表(附代码)

题目描述:

设计并实现自己的链表。{MyLinkedList() 初始化 MyLinkedList 对象。int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。}

题目解读:1.设计链表,单双都可;2.获取下标为 index 的节点的值(查找);2.插入头节点;3.插入尾节点;4.在下标为index的节点前插入新节点,这里index要注意如果是原链表末尾的情况和超出链表长度的情况;5.删除节点

首先题目读清楚,再开始一步一步地分析应该怎么做。这样来看题目就简单许多。而且我觉得对付链表在java里的写法,就是不要过分强调指针到底是什么东西,而要侧重于节点整体,它即表示了数,又指向了另一个节点。感觉会好理解一些。

1.设计链表,在我关于链表的那篇文章里提到了单向列表的设计,这里不再重复。

2.获取下标为index的节点的值。如果用c++来写其实更容易理解一些,但是Java里我在写的时候可以转换思路,不要总想指针是个什么类型的数据,就把它整体当作一个像数组中的元素一样即可。

3.插入头节点,用我们之前提到的虚拟头节点的方法,也就是把这个虚拟头节点的下一个节点换成你要插入的节点。返回时候就返回虚拟头节点.next即返回新的头节点。同时我们看4是在下标为index的节点前插入新节点,根据链表的数值-指针结构可以类比插入头节点的方法。不过这里是要先找到index节点,把它的next换成新节点。也就是说不管在哪里插入节点其实要找的东西都是一样的,index这个节点和它的下一个节点。

4.同理对于删除掉一个节点来说也是一样先找位置再换数据。这里换数据的话比增加节点要简便一些,直接要删除的节点前一个.next=要删除的节点前一个.next.next就可以了。

5.这里有一个共同的注意事项,如果要找的位置小于0或者大于链表的长度了应该单独拿出来划分。

6.还有一个重要的事,就是实际理解链表的找寻和各种操作,不管是单向链表还是双向链表我们始终要明白链表中不同位置的节点是怎么得到的,也即都是通过该节点前后节点所得到,所以不管怎样循环查找节点都是最核心的点。

单向双向

class MyLinkedList { class ListNode{ int val; ListNode next; ListNode(){} ListNode(int val){ this.val = val; } } int size; ListNode dummyhead; public MyLinkedList() { size = 0; dummyhead = new ListNode(0); } public int get(int index) { if(index<0 || index >= size){ return -1; } ListNode cur = dummyhead; for(int i =0;i <= index; i++){ cur=cur.next; } return cur.val; } public void addAtHead(int val) { addAtIndex(0,val); } public void addAtTail(int val) { addAtIndex(size,val); } public void addAtIndex(int index, int val) { if(index > size){ return; }if(index < 0){ index = 0; } size++; ListNode pred = dummyhead; for(int i = 0;i<index;i++){ pred = pred.next; } ListNode newAdd = new ListNode(val); newAdd.next = pred.next; pred.next = newAdd; } public void deleteAtIndex(int index) { if(index <0||index >= size){ return; } size--; ListNode pred = dummyhead; for(int i = 0;i<index;i++){ pred = pred.next; } pred.next = pred.next.next; } } 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mmm`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值