链表
之前找工作的时候,受益于算法笔记,这次开始复习,也是从这本书入手,打算重新学习算法,因此从最基础的开始,只要我们去一点一点付出,最后一定结果不会差。加油,道虽远,行将就至。
链表有若干个节点组成,每一个节点代表一个元素,且结点在内存中的存储位置通常是不连续的,两个节点通过一个指针从一个节点指向另一个节点。
链表主要元素有两个,值和指针。
新建链表节点
下面展示一些 内联代码片
。
新建链表节点 初级入门
node* node1=new node;
node* node2=new node;
node* node3=new node;
node1->data=5;
node->next=node2;
node2->data=6;
node2->next=node3;
node3->data=7;
node3->next=NULL;
新建链表节点 for 循环建立
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
node* next;
{;
node* create(int Array[])
{
node *p, *per,*head;
head=new node;
head->next=NULL;
per=head;
for(int i=0;i<5;i++)
p=new node;
p->data=Array[i];
p->next=NULL;
pre->next=p;
pre=p;//p 就是我们单独建立的节点,用于连接,PRE 节点永远是当前的节点}
returen head;
}
int main()
{
int Array[5]={5,3,6,1,2};
node* L=create(Array);
L=L->next;
while(L!=NULL)
{
printf("%d",L->data);
L=L->next;
}
return 0;
链表的头节点是一个完整的正常的节点。末指针是一个NULL;
关于头节点
链表可以分为带头节点和不带头节点,头结点称为head,且数据域不存放任何内容。指针域next指向第一个数据域有内容的节点
解决链表问题,一般用的方法是双指针方法,一个指针在前一个指针在后,
注意
当在一个链表中要删除一个节点的时候,当我们通过遍历的方法找到这个节点的时候,前指针指向后后指针后,记得将找的的指针delete§
静态数组说白了就是一个数组,只不过这个数组中的元素不再是一个数值,而是一个节点。使用的时候,当作数组使用,数组中的元素是一个是data.一个是当前节点的下一个节点的地址;
反转链表
首先分析,链表的最终节点都是NULL,所以一定先有一个PRE节点用作反转节点的尾节点,之所以没有构造新的节点,因为本来就是用三指针的方法解题,如果涉及的指针较多,容易混乱,当前节点就是Phead节点,三指针的含义就是当前是cur,要把它前一个节点记录,以及它后一个节点;
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode* pre=NULL;
while(pHead!=NULL)
{
ListNode *pnext=pHead->next;
pHead->next=pre;
pre=pHead;
pHead=pnext;
}
return pre;
}
};
递归思想
所谓递归思想,让人望而生畏的原因就是,循环嵌套,层层叠叠,其实让我们生畏的地点往往是敌人薄弱的地方,因为是层层嵌套,因此都是有规律的,递归,第一层递归,第二层递归,第三层递归,,,最后的递归肯定有停止条件,例如NULL,等条件的判断等。所谓递归就是层层循环,跳出第一层递归,游戏就结束了。耐心去分析,层层递归,去建立自己的循环思想
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode *cc=ReverseList(pHead->next);
pHead->next->next=pHead;
pHead->next=NULL;
return cc;
}
};
判断链表中是否有环
使用双指针方法,一个快指针一个慢指针,速度定为2倍,如果两个指针相遇,则有环,这个题中的关键点是判断临界条件,因为是二倍速度,因此需要考虑三节点问题。相当于你一次蹦的二倍速度,就需要考虑其中的节点问题。
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode * fast=head;
ListNode * low=head;
while(low!=NULL&&fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;
low=low->next;
if(fast==low)
return true;
}
return false;}};