203.移除链表元素
ListNode* removeElements(ListNode* head, int val) {
// 问题 第一个元素就是怎么办
while(head && head->val == val){
head = head->next;
}
if(!head){
return head;
}
ListNode* slow = head;
ListNode* fast = head->next;
while(fast){
if(fast->val == val){
slow->next = fast->next;
fast = fast->next;
}else{
slow = slow->next;
fast=fast->next;
}
}
return head;
}
206. 反转链表
ListNode* reverseList(ListNode* head) {
if(!head){
return head;
}
// 反转链表,要记住下一个的下一个
ListNode* pCurr=head;
// 注意不要访问空指针
ListNode* pNext=head->next;
pCurr->next = nullptr;
while(pNext){
ListNode* tmp = pCurr;
pCurr = pNext;
pNext = pNext->next;
pCurr->next = tmp;
}
return pCurr;
}
707. 设计链表
待优化
struct Node{
int val;
Node* next;
Node():val(0), next(nullptr){};
Node(int x): val(x), next(nullptr){};
Node(int x, Node* next): val(x), next(next){};
};
class MyLinkedList {
public:
MyLinkedList() {
head = nullptr;
len = 0;
}
int get(int index) {
if(index > len-1){
return -1;
}
Node* tmp= head;
while(index){
tmp = tmp->next;
--index;
}
return tmp->val;
}
void addAtHead(int val) {
Node* newp = new Node(val, head);
if(head){
head->next = newp;
}else{
head = newp;
}
++len;
}
void addAtTail(int val) {
Node* newp = new Node(val);
if(head){
Node* tmp = head;
while(tmp->next){
tmp = tmp->next;
}
tmp->next = newp;
}else{
head = newp;
}
++len;
}
void addAtIndex(int index, int val) {
if(index > len){
return ;
}
Node* newp = new Node(val);
Node* tmp= head;
while(index-1>0){
tmp = tmp->next;
--index;
}
newp->next = tmp->next;
tmp->next = newp;
++len;
}
void deleteAtIndex(int index) {
if(index > len-1){
return ;
}
Node* tmp= head;
while(index-1>0){
tmp = tmp->next;
--index;
}
tmp->next = tmp->next ? tmp->next->next: nullptr;
--len;
}
private:
Node* head;
int len;
};