c++实现:
在实现过程中主要用于体会对于插入删除那个位置的操作。别正糊涂了。
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
MyLinkedList() {
//设置虚拟头节点,不是真正的链表头节点
_dummyHead = new LinkedNode(0);
_size = 0;
}
int get(int index) {
//获取第index个节点的值,如果index非法就返回-1
if(index >(_size - 1) || index < 0){
return -1;
}
LinkedNode* cur = _dummyHead->next;
while(index--){//这里的如果写成 --index 的话,就会陷入死循环
cur == cur->next;
}
return cur->val;
}
//添加头节点
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
//将原本的头节点赋值newNode的后继
newNode->next = _dummyHead->next;
//虚拟头节点指向新头节点
_dummyHead->next = newNode;
_size++;//长度+1
}
//在链表最后添加节点
void addAtTail(int val) {
//一个新的节点
LinkedNode* newNode = new LinkedNode(val);
//索引节点,从虚拟头节点开始找位置
LinkedNode* cur = _dummyHead;
while(cur->next != nullptr){//这个循环一直遍历到cur后继为空的时候,此时cur指向的是当前链表最后一个节点
cur = cur->next;
}
//添加新节点,数量+1
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
//在index处加入新的数据。
//此处我们要判断一下,如果index为0说明我们要插入头节点,如果index为链表长度,那么我们使用的便是尾插。
//如果index非法,特判,我们返回空。
if(index >_size){
return ;
}
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
//删除节点操作。
if(index >= _size || index < 0){
return ;
}
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;
}
LinkedNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
_size--;
}
};
在评论区看到一位java实现araylist的便捷实现方法,我觉得可以学习一下,wokao,他不只用了arraylist还有其他的,是个佬
class MyLinkedList {
List<Integer> list;
public MyLinkedList() {
list = new ArrayList<>();
}
public int get(int index) {
return index < 0|| index >= list.size()? -1 : list.get(index);
}
public void addAtHead(int val) {
list.add(0,val);
}
public void addAtTail(int val) {
list.add(val);
}
public void addAtIndex(int index, int val) {
if(index<=list.size()){
list.add(index,val);
}
}
public void deleteAtIndex(int index) {
if(index>=0&&index<list.size()){
list.remove(index);
}
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
linkedlist:
class MyLinkedList {
List<Integer> list;
public MyLinkedList() {
list = new LinkedList<>();
}
public int get(int index) {
return index<0||index>=list.size()?-1:list.get(index);
}
public void addAtHead(int val) {
list.add(0,val);
}
public void addAtTail(int val) {
list.add(val);
}
public void addAtIndex(int index, int val) {
if(index<=list.size()){
list.add(index,val);
}
}
public void deleteAtIndex(int index) {
if(index>=0&&index<list.size()){
list.remove(index);
}
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/