Leetcode203.移除链表元素 707.设计链表 206. 反转链表
203.移除链表元素
Link of remove-linked-list-elements
不增加头节点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while (head!= NULL && head->val == val){
ListNode* tmp=head;
head=head->next;
delete tmp;
}
ListNode* cur=head; // current 当前指针从头节点开始后移一一对比
while (cur!= NULL && cur->next!=NULL){
if (cur->next->val==val){
ListNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
}else{
cur=cur->next;
}
}
return head;
}
};
增加头节点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode* cur=dummyHead;
while (cur->next!=NULL){
if(cur->next->val==val){
ListNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
}else{
cur=cur->next;
}
}
head=dummyHead->next;
delete dummyHead;
return head;
}
};
707.设计链表
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
MyLinkedList() {
_dummyHead = new LinkedNode(0);
s = 0;
}
int get(int index) {
if (index > (s - 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->next = _dummyHead->next;
_dummyHead->next = newNode;
s++;
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(cur->next != nullptr){
cur = cur->next;
}
cur->next = newNode;
s++;
}
void addAtIndex(int index, int val) {
if(index > s) 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;
s++;
}
void deleteAtIndex(int index) {
if (index >= s || index < 0) {
return;
}
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur ->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
s--;
}
private://声明私有变量
int s;
LinkedNode* _dummyHead;
};
206. 反转链表
Link of reverse-linked-list//
双指针
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur=head;
ListNode* pre=nullptr;
while(cur){ // 0和null都跳出循环
temp= cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};
递归
class Solution {
public:
ListNode* reverse(ListNode* pre, ListNode* cur){
if(cur==nullptr)return pre;
ListNode* temp=cur->next;
cur->next=pre;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head){
return reverse(nullptr,head);
}
};
迭代from力扣官方
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};