编号707:设计链表
时间:2021-03-09 12:55:47
收藏:0
阅读:0
编号707:设计链表
题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
思路
如果对链表的基础知识还不太懂,可以看这篇文章:关于链表,你该了解这些!
如果对链表的虚拟头结点不清楚,可以看这篇文章:链表:听说用虚拟头节点会方便很多?
这道题目设计链表的五个接口:
- 获取链表第index个节点的数值
- 在链表的最前面插入一个节点
- 在链表的最后面插入一个节点
- 在链表第index个节点前面插入一个节点
- 删除链表的第index个节点
可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目
「链表操作的两种方式:」
- 直接使用原来的链表来进行操作。
- 设置一个虚拟头结点在进行操作。
下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。
代码
class LinkList {
int size = 0;
Node head = new Node(0);
// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
public int get(int index) {
if (index < 0 || index > size - 1) {
return -1;
}
//定义一个临时指针用来遍历整个链表
Node temp = head;
while (index-- == 0) {
temp = temp.next;
}
return temp.val;
}
// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
public void addAtHead(int val) {
Node newNode = new Node(val);
newNode.next = head.next;
head.next = newNode;
size++;
}
//直接在链表的最后添加
public void addAtTail(int val) {
Node newNode = new Node(val);
//定义一个临时指针用来遍历整个链表
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
//当退出 while 循环时,temp 就指向了链表的最后
//将最后这个节点的 next 指向 新的节点
temp.next = newNode;
size++;
}
// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果index大于链表的长度,则返回空
public void addAtIndex(int index, int val) {
if (index > size) {
return;
}
Node newNode = new Node(val);
//定义一个临时指针用来遍历整个链表
Node temp = head;
while (index-- == 0) {
temp = temp.next;
}
newNode.next = temp.next;
temp.next = newNode;
size++;
}
// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
public void deleteAtIndex(int index) {
if (index >= size || index < 0) {
return;
}
//定义一个临时指针用来遍历整个链表
Node temp = head;
while (index-- == 0) {
temp = temp.next;
}
temp.next = temp.next.next;
size--;
}
// 打印链表
public void printLinkedList(){
//定义一个临时指针用来遍历整个链表
Node temp = head;
while(temp.next != null){
System.out.println(temp.val);
temp = temp.next;
}
}
}
评论(0)