解题思路:构建虚拟头结点,可使后续所有的节点操作都一致
ListNode* removeElements(ListNode* head, int val) {
// 虚拟头结点
ListNode* dummpy_head = new ListNode(0);
dummpy_head->next = head;
ListNode* cur = dummpy_head;
while(cur && cur->next) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
return dummpy_head->next;
}
解题思路:注意index下标、虚拟头结点
class MyLinkedList {
public:
struct ListNode {
int val;
ListNode* next;
ListNode(int val):val(val),next(nullptr){}
};
MyLinkedList() {
head_ = new ListNode(0);
size_ = 0;
}
// index为下标,从0开始
int get(int index) {
if (index >= size_ || index < 0) return -1;
ListNode* tmp = head_->next;
while(index-- > 0) {
tmp = tmp->next;
}
return tmp->val;
}
void addAtHead(int val) {
ListNode* new_node = new ListNode(val);
new_node->next = head_->next;
head_->next = new_node;
size_++;
}
void addAtTail(int val) {
ListNode* tmp = head_;
while(tmp->next) {
tmp = tmp->next;
}
ListNode* new_node = new ListNode(val);
tmp->next = new_node;
size_++;
}
void addAtIndex(int index, int val) {
if (index < 0){
addAtHead(val);
return;
}
if (index == size_) {
addAtTail(val);
return;
}
if (index > size_) {
return;
}
ListNode* new_node = new ListNode(val);
ListNode* tmp = head_;
while(index-- > 0) {
tmp = tmp->next;
}
new_node->next = tmp->next;
tmp->next = new_node;
size_++;
}
void deleteAtIndex(int index) {
if (index < 0) return;
if (index >= size_) return;
ListNode* tmp = head_;
while(index-- > 0) {
tmp = tmp->next;
}
tmp->next = tmp->next->next;
size_--;
}
void printList() {
ListNode* cur = head_;
while(cur->next != nullptr) {
std::cout << cur->next->val << " ";
cur = cur->next;
}
std::cout << std::endl;
}
private:
int size_;
ListNode* head_;
};
LeetCode 206. 反转链表
解题思路:需要temp节点临时记录防止断链,需要pre节点
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode* cur = head;
ListNode* pre = NULL;
ListNode* temp = NULL;
while(cur) {
temp = cur -> next;
cur -> next = pre;
pre = cur;
cur = temp;
}
return pre;
}