编程问题:
给定链表大小m,如果原链表长度小于m则保持原链表长度不变,否则将链表长度减小为m
解决思路:
程序思路很简单,首先找到第m+1个节点记为ptr,再设置一个指针指向ptr之后的节点记为ptr1,删除ptr,并将其设置为nullptr,接着设置tmp指针,指向ptr1之后的节点,删除ptr1,ptr1指向tmp,重复操作,直到ptr1为nullptr则结束
ListNode<T>* ptr1 = ptr->next;
delete ptr;
ptr = nullptr;
ListSize--;
ListNode<T>* tmp;
while(ptr1 != nullptr)
{
tmp = ptr1->next;
delete ptr1;
ptr1 = tmp;
ListSize--;
}
就是这么简单的操作出错了,在该函数上找了好长时间的错误,一直找不出来,最后加语句打印,发现是析构函数运行时出现了问题。
析构函数如下:
template<class T>
LinearList<T>::~LinearList()
{
int i = 0;
ListNode<T>* tmp;
while (FirstNode != nullptr)
{
tmp = FirstNode;
FirstNode = FirstNode->next;
delete tmp;
tmp = nullptr;
i++;
}
if (i == ListSize)
std::cout << "Free Mem OK" << std::endl;
}
错误原因:
原本被删除的节点并不是nullptr(我自以为已经是了,毕竟我设置了ptr为nullptr…)。但是ptr不是链表中的指针啊啊啊…特地的写了个程序进行了测试:
#include <iostream>
struct ListNode
{
ListNode* next;
int Num;
ListNode(int elem) :Num(elem), next(nullptr) {}
};
int main()
{
using namespace std;
ListNode* test = new ListNode{ 13 };
test->next = new ListNode{ 17 };
ListNode* ptr = test->next;
delete ptr;
ptr = nullptr;
if (test->next == nullptr)
std::cout << "OK" << std::endl;
delete test;
return 0;
}
不会打印OK
知道错误的原因后,就好解决了
template<class T>
void LinearList<T>::setSize(int theSize)
{
if (ListSize <= theSize)
return;
ListNode<T>* ptr = FirstNode;
for (int i = 0; i < theSize-1; i++)
{
ptr = ptr->next;
}
ListNode<T>* ptr1 = nullptr;
if (ptr->next->next != nullptr)
ptr1 = ptr->next->next;
delete ptr->next;
ptr->next = nullptr;
ListSize--;
ListNode<T>* tmp;
while(ptr1 != nullptr)
{
tmp = ptr1->next;
delete ptr1;
ptr1 = tmp;
ListSize--;
}
}
即找要删除节点的前一个节点,通过next进行取指针(这下是链表中的指针了…),问题解决。其实通过头节点找到相应节点删除,设置nullptr也可以的,然后再回到原来位置会更好看点,先做个记录,防止以后再犯(大概率会重犯)…