nowcoder华为OJ题练习记录

1.cin.get()还没写过

HJ51 输出单向链表中倒数第k个结点## 标题

在这里插入图片描述
已经打印出输出结果了,怎么又进去whie(cin)了? 再按F10就退出了
在这里插入图片描述
按ctrl Z的结果
按Ctrl Z还进去了

在这里插入图片描述
按F10 F5没到什么断点, 控制台黑窗口也没变化,再按回车,变成这样了:
在这里插入图片描述
别人while(cin >> n) 通过了网页测试。我这是while(cin){ cin >> n;
虽然我这第一次cin >> n是正确的,但一轮之后我就看不懂了,只是现在认为while(cin)是判断cin这个对象有没有,不是判断cin输入的内容是不是想要的,或者有“有效输入”,关键是回车也会进去,也是有效的,但是数字不是一般的整数了。

翻了下网页,https://blog.csdn.net/u014182411/article/details/62053816
这篇文章好在又说到了标准输入是键盘,这下才理解了这个模糊的地方,我现在理解是这样,cin不是从控制台读的,是从输入缓冲区读的,是内存中的地方,有回车cin才会去读,控制台看到的也是从键盘读到显示的,和cin是读的是有关的东西,只是控制台还要将键盘输入内容显示在屏幕上,终端上不用回车就拿到了。

while(cin) 结果难分析,别用它了

5

1 2 3 4 5
4
当一轮执行结束,虽然程序位置没停在while(cin >> n), 但是应该是要停在那的,ctrl z后刚好停在while()之后第一句。

在这里插入图片描述
结果对了

不过还有个要求,构建好链表后要忘记链表长度,感觉需要个双链表。
就是有preNode *吧。但是,链表的结构定了,只有next指针,没有pre指针, 快慢指针不错。

在这里插入图片描述
在这里插入图片描述
奇怪,
和这有关?
腾讯电脑管家的软件市场老是打不开, 换360试下

在这里插入图片描述
如果最后的k=2 后面跟个空格,再跟CTRL Z就会正确,为什么先回车就错了?
在这里插入图片描述
每次计算完,新构建链表前,上一个链表没销毁。

bool hasKcounts = true; for循环里有这句话但没有说重定义
通过的答案
#include

using namespace std;

struct ListNode {
int m_nKey;
ListNode *m_pNext;
};

int main()
{
/* head-> 1.key 1.next -> 2.key 2.next -> 3.key 3.next(nullptr)
*/
int n=0;
int k=0;
int ret =0;
auto *head = new(ListNode); // alloc space
auto *p = new(ListNode); // alloc space
auto *fast = new(ListNode); // alloc space
auto *slow = new(ListNode); // alloc space
if(head == nullptr || p == nullptr || fast== nullptr || slow == nullptr){
cout<< “failed, head == nullptr || p == nullptr || fast== nullptr || slow == nullptr” << endl;
ret = -1;
}
p = head;
fast = head;
slow = head;

// while(cin){ 写一个cin就是从输入流里取一次吧,这样没把n保留下来吧
//     cin >> n; 

// 8
// 1 2 3 4 5 6 7 8
// 4
// 5
// 1 2 3 4 5
// 2
while(cin >> n){
head = new(ListNode); // alloc space
p = new(ListNode); // alloc space
fast = new(ListNode); // alloc space
slow = new(ListNode); // alloc space
if(head == nullptr || p == nullptr || fast== nullptr || slow == nullptr){
cout<< “failed, head == nullptr || p == nullptr || fast== nullptr || slow == nullptr” << endl;
ret = -1;
}
p = head;
fast = head;
slow = head;

    for(int i=0; i<n; ++i){
        cin >> p->m_nKey;           // store input to data area          
        /* p x.key x.next        
        */
    // p 2.key store cin
    // p 3.key store cin
        // if(i==0){
        //     head = p; // head -> p 1.key  
        // }
        if(i==n-1){
            p->m_pNext = nullptr;  // 3.p.next(nullptr)
            break;    
        }
        /* head-> 1.key 1.next -> 2.key 2.next -> 3.key 3.next(nullptr)        
        */
        p->m_pNext = new(ListNode); // p at 1.key, create new node
        // how to link 2.key to 1.next
        // p.next ->2.key 1.next->2.key
        // 2.next -> 3.key
        p = p->m_pNext;
        // p -> 2.key
        // p-> 3.key
    }

// 双向链表     <- 1.pre <- 2.pre         <-3.pre
// head-> 1. key 1.next  -> 2.key 2.next -> 3.key 3.next(nullptr)  

// 双向链表不符合链表结构,先不能用,看别人提的快慢指针可以,怎么想到的,厉害
    cin >> k;
    // 快指针要超前慢指针k-1个位置,慢指针起点在head, 快指针起点在head向前K-1个位置,要找k-1下, 1- k-1
    // 如果i< k-1时,fast指向空, 也就是链表才k<-1的长度 举例 k=4, i要等于3 (k-1)时next才可以为nullptr,
    // i=2时i<=k-2时为空,就是倒数的数给大了,总数都不到k个,返回nullptr. n =3 1 2 3, k =4 error

    // fast first forward k-1 step, it's k-1 times, how to go when want backcount one, can cover
    bool hasKcounts = true;
    for(int i=0;i<k-1;++i){
        fast = fast->m_pNext;
        if(fast->m_pNext == nullptr && i < k-2){ // 不到k-1步就到最后一个节点了
            hasKcounts = false;
            cout << "hasn't k counts nodes" << endl;
            break;
        }
    }

    // verify the backcount k node location
    while(fast->m_pNext != nullptr){
        fast = fast->m_pNext;
        slow = slow->m_pNext;
    }
    if (hasKcounts) {
        cout << slow->m_nKey << endl;
    } else {
        ret = -2;
    }
    delete head;
    // delete p; // wont release two times?
    head=nullptr;
    p=nullptr;
    fast=nullptr;
    slow=nullptr;
}

/* for(int i=0;i<n;++i){
if(i==0){
p=head;
}
else {
p = p->m_pNext;
}
delete p; // second to here, cant go on, serveral times said exception
} / // delete fast; unknown signal
// delete slow;
/
ListNode *p1 = head->m_pNext;
cout << “second node:” << p1->m_nKey << “watch first node whether released” << endl; */
return ret;
}
链表delete头结点后应该就不能再delete链表其他节点了,会被认为重复释放,例如再delete p。

##HJ48 从单向链表中删除指定值的节点
在这里插入图片描述
在这里插入图片描述
unique_ptr will auto to free ?当程序结束的时候
// free a pointer p, p will be a random value? it won’t change, *p will be a random value?
}
智能指针如果某时刻想自己释放可以吗
在这里插入图片描述
不行
#####什么时候算引用数不为0,感觉是shared类型的才会有引用不为0的情况吧

shift tab可以往后退四格

    for(i=0;i<5;i++){
        a++;
    }
    for‘s run steps, initial value, compare enter condition, entry or skip for, if enter, step forward value +1, 
    every want entry, need first to look whether condition match

为什么不能读空指针的值
有人说页表发现是无效地址,反馈给操作系统,操作系统报段错误11,让程序自杀,应该是操作系统认为程序已经出错了,再执行肯定不符合期望,就让程序结束吧。

https://so.csdn.net/so/search?spm=1000.2115.3001.4498&q=%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E8%AF%BB%E7%A9%BA%E6%8C%87%E9%92%88%E7%9A%84%E5%80%BC&t=&u=

删除链表的特定值的那个节点 还没做完

// title is thi
// https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f?tpId=37&tqId=21271&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

/* 描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1 3 2表示为 2->3 链表为2->3->1
5 1表示为
1->5
链表为2->3->1->5
最后的链表的顺序为 2 7 3 1 5 4

最后一个参数为2,表示要删掉节点为2的值
删除 结点 2

则结果为 7 3 1 5 4

数据范围:链表长度满足
>=1 int足够
节点中的值满足 >=0 int足够
测试用例保证输入合法
输入描述:
输入一行,有以下4个部分:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值 */

/*要放的节点值 它前面的那个节点的值  */

// 示例1
// 输入:
// 5 2 3 2 4 3 5 2 1 4 3
// 复制
// 输出:
// 2 5 4 1
// 复制
// 说明:
// 形成的链表为2->5->3->4->1
// 删掉节点3,返回的就是2->5->4->1  
// 示例2
// 输入:
// 6 2 1 2 3 2 5 1 4 5 7 2 2
// 复制
// 输出:
// 7 3 1 5 4
// 复制
// 说明:
// 如题  

#include <iostream>
#include <memory>

using namespace std;

typedef struct ListNode
{
    int m_value;
    ListNode *m_pNext;
} ListNode;

int main()
{
    // first value is how many nodes, second value is first node value
    // begin from third value, according value find a node then insert one value after it
    auto head = make_unique<ListNode>();
    auto p = make_unique<ListNode>();
    auto pFind = make_unique<ListNode>();
    if (p == nullptr || head == nullptr || pFind == nullptr)
    {
        cout << "create head or p or pFind failed," << "head:" << head << ",p:" << p 
            << ",pFind:" << pFind << << endl;
    }
    // 2 + (n-1) * 2 + 1 = 2n +1 will get these values
    int n = 0;
    cin >> n;
    constexpr int allInCount = 2 + (n - 1) * 2 + 1;
    int toInsertValue = 0;
    int toInsertAfterIt = 0;
    int toDeleteNumber = 0;
    for (int i = 0; i < allInCount - 2; ++i)
    {
        // can't define a variable in loop?
        if (i == 0)
        {
            cin >> *head;
        }
        else if (i < allInCount - 3)
        {
            if (i % 2 == 1)
            { // index 2 开始 要插入的值 要插入哪个值之后
                cin >> toInsertValue;
            }
            else
            {
                cin >> toInsertAfterIt;
                for (pFind = head; *pFind != toInsertAfterIt; pFind = pFind->m_pNext) // find every node to find toInsertAfterIt
                {
                    if (pFind->m_pNext != nullptr)
                    {
                        p->m_pNext = make_unique<ListNode>();
                        if (p->m_pNext == nullptr)
                        {
                            cout << "make_unique p->m_pNext failed in loop" << "p:" << p << endl;
                        }
                        // a node amend to this List
                        // p point to the lastest node

                        p = p->m_pNext;
                        p->m_value = toInsertValue;
                    }
                }
                p = make_unique<ListNode>();
                p->m_pNext = pFind->m_pNext;
                pFind->m_pNext = p;
                p->m_value = toInsertValue;
            }
        }
        else
        {
            cin >> toDeleteNumber;
        }
        // if want to delete a node,find next node value, 
        // that easier to process need to delete node, and link previous node and next node of to delete node 
        // 不容易判断是否是最后一个节点,if(toDeleteNumber == pFind->m_value){
    //     pFind->m_value = 0; // restore default value
    //     p->m_pNext = p->m_pNext->m_pNext;
    //     p->m_pNext->m_pNext = nullptr; // auto to free ? don't need i to free?
    //     // free a pointer p, p will be a random value? it won't change, *p will be a random value?
    //     for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
    //         cout << p->m_value << " ";
    //     }
    //     cout << endl;
    // }
        // for(pFind = head; *pFind->m_pNext->m_value == toDeleteNumber && pFind!= nullptr; pPrevioud = pFind && pFind = pFind->m_pNext){
        // 太长看的记不住
        // 保存上一个节点的指针,方便删除当前节点,for循环第三句可以做两个事情吗--多半不行-没怎么见过-看答案,保存当前节点的指针,寻找指针指向下一个节点
        // 一种写法是while, 在循环内保存previous节点指针
        // for(pFind = head; *pFind->m_value == toDeleteNumber && pFind!= nullptr; pPrevioud = pFind && pFind = pFind->m_pNext){
            // pFind = head;
            // while(pFind!= nullptr){                
            //     if(toDeleteNumber == pFind->m_value){
            //         delete pFind;
            //         link next node to previous node
            //         break; // 中止吗?
            //     }
            //     pPrevious = pFind;
            // }
        for(pFind = head;pFind!= nullptr;){
            if next=!nullptr
                pPre = p;


            pPrevious = pFind; // 先保存当前节点,如果是要删除的节点就删除呀
            if(toDeleteNumber == pFind->m_value){
                // pFind->m_pNext->m_value = 0; // restore default value
                // p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
                // p->m_pNext->m_pNext = nullptr; // 自动释放?设置的值会自己归零吗 auto to free ? don't need i to free?p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
                p->m_pNext = p->m_pNext->m_pNext; // 链接这个个节点和它的下下一个节点,
                // free a pointer p, p will be a random value? it won't change, *p will be a random value?
                for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
                    cout << p->m_value << " "; // 打印删除后的结果
                }
                cout << endl;
            }
            pFind = pFind->m_pNext; // 不相等就是没找到,就移到下一个节点下来再对比
        }

        // for 是否可以把不相等放在条件内,如果在循环体内相等了,退出就行
        // not found
        if(pFind->m_value != toDeleteNumber && pFind->m_pNext == nullptr){
            cout << "nullptr" << endl;
        }
    }

    // want to save it to a vector

    return 0;
}

11.23 样子
// title is thi
// https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f?tpId=37&tqId=21271&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

/* 描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1 3 2表示为 2->3 链表为2->3->1
5 1表示为
1->5
链表为2->3->1->5
最后的链表的顺序为 2 7 3 1 5 4

最后一个参数为2,表示要删掉节点为2的值
删除 结点 2

则结果为 7 3 1 5 4

数据范围:链表长度满足

=1 int足够
节点中的值满足 >=0 int足够
测试用例保证输入合法
输入描述:
输入一行,有以下4个部分:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值 */

/*要放的节点值 它前面的那个节点的值 */

// 示例1
// 输入:
// 5 2 3 2 4 3 5 2 1 4 3
// 复制
// 输出:
// 2 5 4 1
// 复制
// 说明:
// 形成的链表为2->5->3->4->1
// 删掉节点3,返回的就是2->5->4->1
// 示例2
// 输入:
// 6 2 1 2 3 2 5 1 4 5 7 2 2
// 复制
// 输出:
// 7 3 1 5 4
// 复制
// 说明:
// 如题

// 代码考虑上传github, 有git记录
#include
#include

using namespace std;

typedef struct ListNode
{
int m_value;
ListNode *m_pNext;
} ListNode;

int main()
{
// 执行过程 创建指针 按要构造的链表长度逐个插入节点 找到要删除的节点 打印所有节点
//
// 构造过程,例如输入一行数据为:
// 6 2 1 2 3 2 5 1 4 5 7 2 2
// 则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
// 构造过程不一般 输入2n+1个数,告诉在哪个节点后插入一个节点 先要插入的节点 再告诉在谁之后
// 节点个数1个, 第一个节点1个,告诉n-1个节点的内容的数就是 插入n-1个要2(n-1)个,要删除的节点的值1个, 共1+1+2(n-1)个数
// first value is how many nodes, second value is first node value
// begin from third value, according value find a node then insert one value after it
auto head = make_unique();
auto p = make_unique();
auto pFind = make_unique();
if (p == nullptr || head == nullptr || pFind == nullptr)
{
cout << “create head or p or pFind failed,” << “head:” << head << “,p:” << p
<< “,pFind:” << pFind << endl;
}
// 2 + (n-1) * 2 + 1 = 2n +1 will get these values
int n = 0;
cin >> n;
cin >> *head;
// constexpr int leftInputCount = (n - 1) * 2 + 1; // 开始这个allInCount之后看怎么还赌博上了,嘴角抽动, 改成allInputCount, 再改成leftInputCount
int insertNodeNeedCount = (n - 1) * 2;
int toInsertValue = 0;
int toInsertAfterIt = 0;
int toDeleteNumber = 0;

// 插入
// 拿节点值构造链表 步进多少步 重复做的事情多少遍 处理过程有环 循环
// 还需执行
for (int i = 0; i < insertNodeNeedCount; ++i) // 之前有输入过allInputCount -2, leftInputCount就是2n, 就是< 2n
{
    // can't define a variable in loop?
    // if (i < leftInputCount - 1)  // < 2n-1 , 最大到2n-2, n-1个节点值
    // {
    if (i % 2 == 0) // 0 1 2 3 4 5 ... 0 2 4是要插入的值,规律它们都是2的倍数
    { //  开始 要插入的值
        cin >> toInsertValue;
    }
    else
    { // 输入要插入到哪个点之后的点,插入
        cin >> toInsertAfterIt;
        // 插入新节点 pFind和p什么关系,有必要留p吗?
        for (pFind = head; pFind != nullptr; pFind = pFind->m_pNext) // find every node to find toInsertAfterIt
        {
            // 这句话取消 第二句->m_pNext要单独放一行吗,先不留,看下, 如果是空怎么办,再单独判断, && pFind->m_pNext->m_pNext != nullptr
            // if (pFind->m_pNext != nullptr) // next不解引用, 不用判断它
            // {
            //这个节点是要找的了,就先把下个节点先和要插入的节点连起来,再把这个节点和要插入的节点连起来
            if(pFind->m_value == toInsertAfterIt){
                p = make_unique<ListNode>(); // 按结构体要求分配内存,头指针交给pFind,
                if (p == nullptr)
                {
                    cout << "make_unique p->m_pNext failed in loop" << "p:" << p << endl;
                }
                // a node amend to this List
                // p point to the lastest node

                p->m_value = toInsertValue; // 分配一个节点后,赋值给它
                p->m_pNext = pFind->m_pNext; // 当前节点的下一个节点连在要插入的节点后面, 
                // 第一个节点或者最后一个节点后面都是空节点,这句也适用
                pFind->m_pNext = p; // 要插入的节点连在找到的节点后面
                break; // 找到就退出循环
            }
        }
        if (pFind == nullptr) {
            // 最后一个节点了,也没找到要插入的
            cout << "node had input may has error, not found that node to insert after it" << endl;
        }
    }
}

// 删除         
cin >> toDeleteNumber;
for(pFind = head; pFind!= nullptr; pFind = pFind->m_pNext;){
    // if next=!nullptr
    //     pPre = p;
    // 链接上一个节点和下一个节点 难
    // 用下一个节点的值去和要比较的值对比,如果相等了,再做这个节点和下下个节点的连接, 这样也不用保存了
    if(pFind->m_pNext != nullptr){
        if(pFind->m_pNext->m_pNext != nullptr){
            if(toDeleteNumber == pFind->m_pNext->m_pNext->m_value){ // 判断下下个节点和要删除的值是不是相等,不相等就回到for 条件步进那
                // pFind->m_pNext->m_value = 0; // restore default value
                // p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
                // p->m_pNext->m_pNext = nullptr; // 自动释放?设置的值会自己归零吗 auto to free ? don't need i to free?p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
                // pFind->m_pNext 这种也指向的是下个节点存储数据的地址 表格 第一列 编号 内存位置编号

                // 怕以下2句把pFind->m_pNext的值也改为nullptr了。应该不会
                // auto p_next_next = pFind->m_pNext->m_pNext; 
                // pFind->m_pNext->m_pNext = nullptr; 

                // pFind->m_pNext = p_next_next; 考虑要这么做,auto p_next_next 这句性能,语法要再考虑
                // (下个节点的next要设置为空了, 以免没有释放掉后面能操作这个链表的节点的值。也避免释放这个节点时把它连接的后续节点给释放了//这句还没实现)
                // 链接这个词语像是轻巧的东西,抓住这个一甩,后面的也动了,连接像很重的东西,两者能交流,但是动一个,另一个一般不动
                // 假如p-next-next 是16 打印一个指针的值 显示的是它的虚拟内存地址 还是真实内存地址 真实的也无妨吧
                // 假如开始pFind->m_pNext是8,pFind->m_pNext->m_pNext是16,把16保存给a, 把pFind->m_pNext->m_pNext置为0,

                // 现在保存把16记住,要申请后分配一个节点,这个节点不分配节点只用int保存下指针值行不行,ListNode *m_pNext; 第一种方法Int *赋值的时候强制转换?
                // 第二种方法是复制一个节点,指向它的指针的值是pFind->m_pNext->m_pNext的值16,它的next置为0,但是它的地址值估计只能是分配的吧,不能设置
                int * p_next_next = (int *)pFind->m_pNext->m_pNext;
                // pFind->m_pNext = pFind->m_pNext->m_pNext; // // 链接这个个节点和它的下下一个节点, 把下个节点断开了,
                pFind->m_pNext->m_pNext = nullptr;
                pFind->m_pNext = (ListNode *)p_next_next; // // 链接这个个节点和它的下下一个节点, 把下个节点断开了,
                // free a pointer p, p will be a random value? it won't change, *p will be a random value?
            }
        } else {

        }
    } else { // 到最后一个节点了
        if(toDeleteNumber == pFind->m_pNext->m_value){ // 不相等就回到for 条件步进那
            // pFind->m_pNext->m_value = 0; // restore default value
            // p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
            // p->m_pNext->m_pNext = nullptr; // 自动释放?设置的值会自己归零吗 auto to free ? don't need i to free?p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
            pFind->m_pNext = pFind->m_pNext->m_pNext; // 链接这个个节点和它的下下一个节点,
            // free a pointer p, p will be a random value? it won't change, *p will be a random value?
        }
    }
    //pFind = pFind->m_pNext; // 不相等就是没找到,就移到下一个节点下来再对比
}


    //     for(pFind = head;pFind!= nullptr;pFind = pFind->m_pNext;){
    //         // if next=!nullptr
    //         //     pPre = p;
    //         if(toInsertAfterIt == pFind->m_value){ // 不相等就回到for 条件步进那
    //             // pFind->m_pNext->m_value = 0; // restore default value
    //             // p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
    //             // p->m_pNext->m_pNext = nullptr; // 自动释放?设置的值会自己归零吗 auto to free ? don't need i to free?p->m_pNext = p->m_pNext->m_pNext; 
    //             // // 链接上一个节点和下一个节点
    //             p->m_pNext = pFind->m_pNext->m_pNext; // 链接这个个节点和它的下下一个节点,
    //             // free a pointer p, p will be a random value? it won't change, *p will be a random value?
    //             for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
    //                 cout << p->m_value << " "; // 打印删除后的结果
    //             }
    //             cout << endl;
    //         }
    //         //pFind = pFind->m_pNext; // 不相等就是没找到,就移到下一个节点下来再对比
    //     }

    // }

    // if want to delete a node,find next node value, 
    // that easier to process need to delete node, and link previous node and next node of to delete node 
    // 不容易判断是否是最后一个节点,if(toDeleteNumber == pFind->m_value){
//     pFind->m_value = 0; // restore default value
//     p->m_pNext = p->m_pNext->m_pNext;
//     p->m_pNext->m_pNext = nullptr; // auto to free ? don't need i to free?
//     // free a pointer p, p will be a random value? it won't change, *p will be a random value?
//     for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
//         cout << p->m_value << " ";
//     }
//     cout << endl;
// }
    // for(pFind = head; *pFind->m_pNext->m_value == toDeleteNumber && pFind!= nullptr; pPrevioud = pFind && pFind = pFind->m_pNext){
    // 太长看的记不住
    // 保存上一个节点的指针,方便删除当前节点,for循环第三句可以做两个事情吗--多半不行-没怎么见过-看答案,保存当前节点的指针,寻找指针指向下一个节点
    // 一种写法是while, 在循环内保存previous节点指针
    // for(pFind = head; *pFind->m_value == toDeleteNumber && pFind!= nullptr; pPrevioud = pFind && pFind = pFind->m_pNext){
        // pFind = head;
        // while(pFind!= nullptr){                
        //     if(toDeleteNumber == pFind->m_value){
        //         delete pFind;
        //         link next node to previous node
        //         break; // 中止吗?
        //     }
        //     pPrevious = pFind;
        // }

        
    // for(pFind = head;pFind!= nullptr;pFind = pFind->m_pNext;){
    //     // if next=!nullptr
    //     //     pPre = p;
    //     if(toDeleteNumber == pFind->m_value){ // 不相等就回到for 条件步进那
    //         // pFind->m_pNext->m_value = 0; // restore default value
    //         // p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
    //         // p->m_pNext->m_pNext = nullptr; // 自动释放?设置的值会自己归零吗 auto to free ? don't need i to free?p->m_pNext = p->m_pNext->m_pNext; // 链接上一个节点和下一个节点
    //         p->m_pNext = p->m_pNext->m_pNext; // 链接这个个节点和它的下下一个节点,
    //         // free a pointer p, p will be a random value? it won't change, *p will be a random value?
    //         for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
    //             cout << p->m_value << " "; // 打印删除后的结果
    //         }
    //         cout << endl;
    //     }
    //     //pFind = pFind->m_pNext; // 不相等就是没找到,就移到下一个节点下来再对比
    // }
    

    // for 是否可以把不相等放在条件内,如果在循环体内相等了,退出就行:可以,不过下面再判断一次指向的值不等于要删除的值更保险
    // not found
    // if(pFind->m_value != toDeleteNumber && pFind->m_pNext == nullptr){
    // 现在应该是输出这个条件了。指针值已经是0了。
    if(pFind == nullptr){
        cout << "nullptr" << endl;
    }
}


// want to save it to a vector

for(p==head; p->m_pNext != nullptr; p= p->m_pNext){
    cout << p->m_value << " "; // 打印删除后的结果
}
cout << endl;

return 0;

}

智能指针能用cout输出吗

要改成这样吗?
/*
讯飞星火
#include
#include
using namespace std;

struct ListNode {
int val;
unique_ptr next;
ListNode(int x) : val(x), next(nullptr) {}
};

int main() {
auto head = make_unique(0); // 初始化head节点
auto p = make_unique(1); // 初始化p节点
auto pFind = make_unique(2); // 初始化pFind节点

if (!p || !head || !pFind) {
    cout << "create head or p or pFind failed," << "head:" << head.get() << ",p:" << p.get() 
         << ",pFind:" << pFind.get() << endl;
} else {
    cout << "All nodes created successfully." << endl;
}

return 0;

}

讯飞星火大模型

ListNode(int x) : val(x), next(nullptr) {} 是 C++ 中一个构造函数的定义,用于初始化 ListNode 对象。具体来说:

ListNode(int x) 是一个构造函数,接受一个整数参数 x。
val(x) 表示将传入的参数 x 赋值给成员变量 val。
next(nullptr) 表示将成员变量 next 初始化为空指针(即 nullptr)。
这个构造函数的作用是创建一个 ListNode 对象,并初始化其 val 和 next 成员。

为什么需要 0?
在代码 auto head = make_unique(0); 中,make_unique(0) 创建了一个 ListNode 对象,并将其值初始化为 0。这里的 0 只是一个示例值,你可以根据需要将其替换为任何整数值。例如:

cpp
复制代码
auto head = make_unique(5); // 创建一个值为5的节点

没有 0 行不行?
如果没有提供初始值,编译器会报错,因为 ListNode 的构造函数需要一个整数参数。例如:

cpp
复制代码
auto head = make_unique(); // 错误:缺少必要的参数

这会导致编译错误,因为 ListNode 的构造函数没有默认参数。因此,必须提供一个整数参数来初始化 ListNode 对象的 val 成员。

完整示例
以下是一个完整的示例,展示如何定义和使用 ListNode 类及其构造函数:

cpp
复制代码
#include
#include
using namespace std;

struct ListNode {
int val;
unique_ptr next;
ListNode(int x) : val(x), next(nullptr) {}
};

int main() {
auto head = make_unique(0); // 创建一个值为0的节点
cout << "Head node value: " << head->val << endl; // 输出节点的值
return 0;
}

在这个示例中,我们定义了一个简单的链表节点结构 ListNode,并通过 make_unique(0) 创建了一个值为 0 的头节点。
*/

改成原始指针?

terminal 命令行终端
在这里插入图片描述
在这里插入图片描述alt f 截图全屏 terminal里看到的信息比problems里的详细很多,当调试启动报错,继续调试,会出现这里

怎样从vscode工程中移除一个文件,只留一个文件供编译

两个#加一个空格就是能变2级标题
c++ 里用new, 不用malloc了吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值