/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *nhead=new ListNode(0);
ListNode *p=nhead;
nhead->next=head;
while(p->next!=NULL){
if(p->next->val==val){
p->next=p->next->next;
}else{
p=p->next;
}
}
return nhead->next;
}
};
不难,没啥说的,创建一个新的空的头节点也就是虚拟头节点,可以对整个链表进行统一的操作,不需要区分头节点与其他节点。
class MyLinkedList {
public:
struct listnode{
int val;
listnode* next;
listnode(int x): val(x), next(NULL){}
};
int size;
listnode* head;
MyLinkedList() {
size=0;
head=new listnode(-1);
}
int get(int index) {
listnode* p=head;
if(index>size-1){
index=-1;
}
while(index>=0){
p=p->next;
index--;
cout << p->val;
}
return p->val;
}
void addAtHead(int val) {
listnode* np=new listnode(val);
np->next=head->next;
head->next=np;
size++;
}
void addAtTail(int val) {
addAtIndex(size,val);
}
void addAtIndex(int index, int val) {
if(index<=size){
listnode* np=new listnode(val);
listnode* p=head;
while(index>0){
p=p->next;
index--;
}
np->next=p->next;
p->next=np;
size++;
}
}
void deleteAtIndex(int index) {
listnode* p=head;
if(index<size){
while(index>0){
p=p->next;
index--;
}
p->next=p->next->next;
size--;
}
}
};
/**
* 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);
*/
就是把插入、删除、查询合到一起,不难。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* nhead=NULL;
ListNode* p=new ListNode(0);
p->next=head;
head=p;
while(head->next!=NULL){
p=head->next;
head->next=p->next;
p->next=nhead;
nhead=p;
}
return nhead;
}
};
将原来的链表从头开始拆出来,用头插的方式进行重新组合就行。