203移除链表元素
使用虚拟头节点,统一删除头节点和普通节点操作
操作节点是值节点的上一个节点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *Head=new ListNode(0);//虚拟头节点
Head->next=head;
ListNode *run=Head;
while(run->next!=NULL)
{
if(run->next->val==val)
{
ListNode * tmp=run->next;
run->next=run->next->next;
delete tmp;
}else{
run=run->next;
}
}
head=Head->next;
delete Head;
return head;
}
};
707设计链表
使用虚拟头节点
class MyLinkedList {
public:
struct LinkNode{
int val;
LinkNode* next;
LinkNode(int val):val(val),next(nullptr){};
};
int size;
LinkNode* head;
MyLinkedList() {
head = new LinkNode(0);
size=0;
}
int get(int index) {
if(index>(size-1)||index<0)
{
return -1;
}
LinkNode* cur=head->next;
while(index--)
{
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkNode * newNode = new LinkNode(val);
newNode->next=head->next;
head->next=newNode;
size++;
}
void addAtTail(int val) {
LinkNode * newNode = new LinkNode(val);
LinkNode* cur=head;
while(cur->next!=nullptr){
cur=cur->next;
}
cur->next=newNode;
size++;
}
void addAtIndex(int index, int val) {
if(index>size)
{return;}
LinkNode * newNode = new LinkNode(val);
LinkNode* cur=head;
while(index--){
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
size++;
}
void deleteAtIndex(int index) {
if(index>=size||index<0)
{
return;
}
LinkNode* cur=head;
while(index--){
cur=cur->next;
}
LinkNode * temp = cur->next;
cur->next=cur->next->next;
delete temp;
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);
*/
206反转链表
双指针、三指针
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre=nullptr;//反转后的指向
ListNode *cur=head;//要反转的位置
while(cur!=nullptr)
{
ListNode *nex=cur->next;//暂存下一个要反转的位置
cur->next=pre;
pre=cur;
cur=nex;
}
return pre;
}
};
迭代法,主要是参数赋值
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* head)
{
if(head==nullptr)
{
return pre;
}
ListNode *temp =head->next;
head->next=pre;
return reverse(head,temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(nullptr,head);
}
};