画图可以让一些抽象的文字语言更加形象生动
画图!!!->直观+形象+便于我们理解
例如:
现在有一个结构体
struct s
{
struct s*pprev;
struct s*pnext;
}
他们的的关系如下:
prev->pnext->pnext=cur;
cur->pprev->prev=prev;
cur->pnext=prev;
prev->pprev=cur;
是不是感觉无从下手,但是我们只要转化为图形就能很好的理解:
在链表算法题中很多时候都会给我们传来的头节点为空情况,如果我们没有判断直接对空指针进行解引用,程序可能会直接崩溃:
如果我们能引入一个头节点,则可以避免直接对空指针解引用情况
这个头节点我们也会称作‘哨兵位’:
如果不引入中间变量
prev->pnext->pprev=cur;
cur->pnext=prev->pnext;
prev->pnext=cur;
cur->pprev=prev;
引入中间变量next,代码更加干净整洁
next=prev->pnext;
next->pprev=cur;
cur->pnext=next;
prev->pnext=cur;
cur->pprev=prev;
相遇:
2.常用操作
例如:创建一个head的指针
s*head=new s();
tail->next=cur;
cur=tail;
cur->next=head->next;
head->next=cur;
常用于反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* phead=new ListNode();
if(head==nullptr) return nullptr;
phead->next=head;
ListNode*cur=head->next;
head->next=nullptr;
while(cur!=nullptr)
{
ListNode*temp=cur->next;
cur->next=phead->next;
phead->next=cur;
cur=temp;
}
return phead->next;
}
};