● 链表理论基础
单链表
双链表
循环链表
定义链表
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
● 203.移除链表元素
第一次写的错误代码,无法运行,我的具体思路就是再建一个链表,然后保存住head头结点的位置,其实这里还需要判断一下头结点是否更改了,如果更改了的话那保存head的s2也是需要更改的,但是程序一点都运行不了,看一下正确答案
【错误无法运行版】
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode * s1,s2;
s1=head->next;
s2=head;
for(;head!=NULL;head=head->next)
if(head.val==val)
{
sl=head->next;
}
return head;
}
};
【标准答案】
思路一:
直接在原表上进行删除操作
首先需判断头结点是不是可删元素。若是,直接新令一个节点等于head->next,若不是还需要保存一下头结点。
class Solution{
public:
ListNode *removeElements(ListNode *head ,int val){
while(head!=NULL&&head->val==val)//如果头结点不是0,并且对应的值是val,开始觉得这个地方不一定必须是while,可以用if,但是用哪个if出错了,说明它不仅可以判断头结点,也可以判断删除头结点后的新的头结点是不是需要删除的数
{
ListNode * tmp = head;//建立一个新的节点,等于头结点
head=head->next;//头结点等于它的下个节点
delete tmp;//删除tmp, 那建立它干啥呢,直接令head=head->next不行吗(这里保存应该就是为了后期释放的,因为c++不支持自己释放,需要手动释放)
}
ListNode *cur head;//保存头结点
while(cur !=NULL&&cur->next!=NULL)
{if(cur->next->val==val)//如果cur下一个数对应的值是val
{
ListNode *tem =cur->next;//这里也用tmp存一下需要删除的节点
cur->next=cur->next->next;//越过中间连接到下一个节点上
delete temp;//释放空间
}
else
{cur = cur -> next;//继续循环
}
}
return head;
}
根据思路重新写的
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head!=NULL&&head->val==val)
{
ListNode* tmp;
tmp= head;
head = head->next;
delete tmp;
}
ListNode*cur=head;
ListNode* p1=head;
while(cur!=NULL)
{
if(cur->val==val)
{
ListNode* tmp=cur;
p1->next=cur->next;
cur=cur->next;
delete tmp;
}
else
{
p1=cur;
cur=cur->next;
}
}
return head;
}
};
● 707.设计链表
就是实际一些链表相关的功能函数,感觉挺简单的,但是写不出来…
【标准答案】
class MyLinkedList {//自己设计一个链表
public:
MyLinkedList() {
this->size = 0;
this->head = new ListNode(0);
}
int get(int index) {
if (index < 0 || index >= size) {
return -1;
}
ListNode *cur = head;
for (int i = 0; i <= index; i++) {
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
addAtIndex(0, val);
}
void addAtTail(int val) {
addAtIndex(size, val);
}
void addAtIndex(int index, int val) {
if (index > size) {
return;
}
index = max(0, index);
size++;
ListNode *pred = head;
for (int i = 0; i < index; i++) {
pred = pred->next;
}
ListNode *toAdd = new ListNode(val);
toAdd->next = pred->next;
pred->next = toAdd;
}
void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
size--;
ListNode *pred = head;
for (int i = 0; i < index; i++) {
pred = pred->next;
}
ListNode *p = pred->next;
pred->next = pred->next->next;
delete p;
}
private:
int size;
ListNode *head;
};