《算法笔记》之链表&二叉树

链表

之前找工作的时候,受益于算法笔记,这次开始复习,也是从这本书入手,打算重新学习算法,因此从最基础的开始,只要我们去一点一点付出,最后一定结果不会差。加油,道虽远,行将就至。
链表有若干个节点组成,每一个节点代表一个元素,且结点在内存中的存储位置通常是不连续的,两个节点通过一个指针从一个节点指向另一个节点。
链表主要元素有两个,值和指针。
新建链表节点
下面展示一些 内联代码片

新建链表节点 初级入门
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;}};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free_girl_fang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值