203.移除链表元素
本题需要注意的是,如果删除的是头节点,需要单独进行处理。
可以设置一个虚拟头节点,这样就可以按照统一的方式删除节点了。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0);//设置一个虚拟头节点
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur!=nullptr && cur->next!=nullptr){
if(cur->next->val==val){//值相等,删除节点
ListNode* t = cur->next;
cur->next = cur->next->next;
delete t;
}else
cur = cur->next;
}
return dummyHead->next;
}
};
707.设计链表
这道题目设计链表的五个接口:
- 获取链表第index个节点的数值
- 在链表的最前面插入一个节点
- 在链表的最后面插入一个节点
- 在链表第index个节点前面插入一个节点
- 删除链表的第index个节点
可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目。
我们采用设置虚拟头节点的方式来操作链表。
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) {
if(index<0 || index>size-1)return -1;
LinkedNode* cur = dummyHead->next;
while(index--)cur = cur->next;
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = dummyHead->next;
dummyHead->next = newNode;
size++;
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = dummyHead;
while(cur->next!=nullptr)cur = cur->next;//寻找最后一个节点
cur->next = newNode;
size++;
}
//index<=0头部插入节点
//index=size尾部插入节点
//index>size不插入节点
void addAtIndex(int index, int val) {
if(index>size)return;
if(index<0)index=0;
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<0 || index>size-1)return;
LinkedNode* cur = dummyHead;
while(index--)cur = cur->next;
cur->next = cur->next->next;
size--;
}
private:
int size;
LinkedNode* dummyHead;
};
206.反转链表
双指针法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* tmp;//保存cur的下一个节点
ListNode* cur = head;
ListNode* pre = nullptr;
while(cur!=nullptr){
tmp = cur->next;// 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre;//翻转
pre = cur;//更新pre和cur指针
cur = tmp;
}
return pre;
}
};