代码随想录Day3(203.移除链表元素,707.设计链表,206.反转链表)
203.移除链表元素
思路:head前加一个虚拟节点,保证移除head时保持一致。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy = new ListNode();
dummy->next = head;
ListNode* cur = dummy;
while(cur->next!=NULL){
if(cur->next->val == val){
cur->next = cur->next->next;
}
else{
cur = cur->next;
}
}
return dummy->next;
}
};
707.设计链表
思路:
class MyLinkedList {
public:
struct LinkNode{
int val;
LinkNode* next;
LinkNode(int x): val(x), next(nullptr){}
};
MyLinkedList() {
dummy = new LinkNode(0);
size = 0;
}
int get(int index) {
LinkNode* cur = dummy;
if(index>=size){
return -1;
}
else{
while(index>=0){
cur = cur->next;
index--;
}
return cur->val;
}
}
void addAtHead(int val) {
LinkNode* node = new LinkNode(val);
node->next = dummy->next;
dummy->next = node;
size++;
}
void addAtTail(int val) {
LinkNode* node = new LinkNode(val);
LinkNode* cur = dummy;
int l = size;
while(l>0){
cur = cur->next;
l--;
}
cur->next = node;
node->next = nullptr;
size++;
}
void addAtIndex(int index, int val) {
if(index<=size){
LinkNode* node = new LinkNode(val);
LinkNode* cur = dummy;
int l = index;
while(l>0){
cur = cur->next;
l--;
}
node->next = cur->next;
cur->next = node;
size++;
}
}
void deleteAtIndex(int index) {
if(index<size){
LinkNode* cur = dummy;
int l = index;
while(l>0){
cur = cur->next;
l--;
}
cur->next = cur->next->next;
size--;
}
}
private:
int size;
LinkNode* dummy;
};
206.反转链表
思路:设置两个指针依次反转当前节点和下一个节点的指向。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
if(head==nullptr||head->next==nullptr){
return head;
}
ListNode* temp = cur->next;
cur->next = nullptr;
while(temp!=nullptr){
ListNode* temp1 = temp->next;
temp->next = cur;
cur = temp;
temp = temp1;
}
return cur;
}
};
总结
注意链表的定义。