203.移除链表元素
简单,熟悉下用头结点;
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy_head = new ListNode(-1);
dummy_head->next = head;
ListNode *current = dummy_head;
while(current->next!= NULL){
//if(current->val == val){ 这句写错了,这么写就无法
if(current->next->val == val){
/* 这两句忘记了
ListNode *tmp = current->next;
*/
current->next = current->next->next;
//delete tmp;
}else{
current=current->next;
}
}
return dummy_head->next;
}
};
707.设计链表
个人要熟悉下while(index--) 这种写法,另外还有一些size的边界条件的考虑。逻辑实现不复杂; 下面的程序还没调通有些细节要改改。
class MyLinkedList {
struct Node{
int val;
Node *next;
Node(int x): val(x),next(nullptr){}
};
public:
MyLinkedList() {
dummy_head = new Node(-1);
size=0;
}
int get(int index) {
if(index<0 || index>(size-1))
return -1;
Node *current = dummy_head->next;
while(index--){
current=current->next;
}
return current->val;
}
void addAtHead(int val) {
Node* new_node = new Node(val);
Node* tmp = dummy_head->next;
dummy_head->next =new_node;
new_node->next =tmp;
size++;
}
void addAtTail(int val) {
Node *current = dummy_head;
while(current->next != NULL){
current= current->next;
}
Node* new_node = new Node(val);
current->next =new_node;
new_node->next = NULL;
size++;
}
void addAtIndex(int index, int val) {
if(index >size) return;
if(index<0) index =0;
Node *current = dummy_head;
while(index--){
current= current->next;
}
Node* tmp = current->next;
Node* new_node = new Node(val);
current->next =new_node;
new_node->next=tmp;
size++;
}
void deleteAtIndex(int index) {
if( index>=size || index<0){
return;
}
Node *current = dummy_head;
while(index--){
current=current->next;
Node *tmp = current->next;
current->next =current->next->next;
delete tmp;
size--;
}
}
private:
int size;
Node* dummy_head;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
206.反转链表
知道双指针逻辑动图的话实现起来挺简单的
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *previous = NULL;
ListNode* current = head;
while(current!=NULL){
ListNode* tmp=current->next;
current->next = previous;
previous = current;
current = tmp;
}
return previous;
}
};