203移除链表元素
设置虚拟头节点的下一个节点指向头节点,在设置指针节点遍历链表,
循环遍历链表遇到目标值,就p->next=p->next->next同时将要删除的节点保存在指针里,然后删除指针,否则继续往后遍历元素,最后返回虚拟头节点的下一个节点,之所以不返回head,可能head也可能是目标节点被删除
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* p=dummy;
while(p->next!=nullptr)
{
if(p->next->val==val)
{
ListNode* tmp=p->next;
p->next=p->next->next;
delete tmp;
}
else{
p= p->next;
}
}
return dummy->next;
}
};
707设计链表
该题涉及链表的基础,包括怎删改查,需反复观看,联系
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){}
};
MyLinkedList() {
_dummyHead=new LinkedNode(0);
_size=0;
}
int get(int index) {
if(index>(_size-1)||index<0)
{
return -1;
}
LinkedNode* cur=_dummyHead->next;
while(index--){
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode=new LinkedNode(val);
newNode->next=_dummyHead->next;
_dummyHead->next=newNode;
_size++;
}
void addAtTail(int val) {
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur =_dummyHead;
while(cur->next!=nullptr)
{
cur=cur->next;
_size++;
}
}
void addAtIndex(int index, int val) {
if(index>_size)
{
return ;
}
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur=_dummyHead;
while(index--)
{
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index>=_size||index<0)
{
return;
}
LinkedNode* cur=_dummyHead;
while(index--)
{
cur=cur->next;
}
LinkedNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
_size--;
}
void printLinkedList()
{
LinkedNode* cur=_dummyHead;
while(cur->next!=nullptr)
{
cout<<cur->next->val<<" ";
cur=cur->next;
}
cout<<endl;
}
private:
int _size;
LinkedNode* _dummyHead;
};
206反转链表
设置两个指针,一个cur指向零,一个pre指向空,先反转第一个指针的下一个元素指向空,同时保留该指针之前的第二个节点,同时指向空的节点指向cur,cur指向保留之前的节点,实现反转,然后继续循环遍历
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur=head;
ListNode* pre=NULL;
while(cur)
{
temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};