这要看一下类的定义是不是哪儿写错了没有
在老师的范例代码之中确实是这样的,这样的链表是带有头结点的链表,按你的理解是没有问题的,头结点名称可以代表链表的名称。但同时还有一种形式的链表是没有头结点的,头结点直接就开始存储有效数据了。当然这都是后话,对于带头结点的链表,你现有的理解是正确的,就这样记住就很好。?
头结点不是第一个结点,链表长度不包含头结点,i从头结点之后的第一个结点(0号结点)算起,比如i=3,那就是第四个结点
当然先要从0遍历到i使currentNode来到i节点的位置
哦哦,currentNode一直没申请空间,而newNode申请了空间。
移动端设备,右下角有个加号,加号里有下载
代码可以参考同学笔记,不过建议最好自己动手敲一遍
右下角灰色操作字找删除
不算 从构造函数可以看到 长度是0
因为两个都是指针,所以这句直接等于的
释放内存啊,降低你算法的存储量需求,这是个好的习惯。
currentNode是局部变量 怎么会冲突
具体链表如图,
因为之前分配了 ,所以每次删除都要delete啊
currentnode与m_pNode都是指针,指向相同的地址,如果delete currentnode会将m_pNode的内存一并释放,m_pNode还在使用中所以报错。
头节点是0 第一个节点是1 第二节点是2.最后一个节点是m_length..所以i可以取到m_length ,这个看你怎么理解,如果头节点不算,第一个节点为0 则不能取到
可以理解为赋值吧,Node节点有数据域和指针域,对指针域赋值下一个节点,就是指向下一个节点的意思,我是这么理解的~
是的,保存输出看看删除的对不对
头节点并不是有效节点,可以看作是下标-1。
int i=1;头节点为位置为0的的节点,就在其后(位置为1)插入节点。
current->next就是一个Node节点,里面存放在data和一个指向下一个node的指针。delete currentNode就是把这个节点所有数据删除, 包括data和指针
bool List::ListDelete(int i,Node *pNode)
{
if(i<0 || i>=m_iLength)
return false;
Node *currentNode=m_pList; //保存头节点
Node *currentNodeBefore=NULL; //头节点前一个节点不存在,为NULL
for(int k=0;k<=i;k++) //查找第i个节点
{
currentNodeBefore=currentNode; //找到第i-1个节点
currentNode=currentNode->next; //循环结束代表currentNode就是第i节点
}
currentNodeBefore->next=currentNode->next;//第i个节点指针域赋给第i-1节点指针域
pNode->data=currentNode->data; //删掉节点的数据域赋给pNode输出
delete currentNode; //释放删除节点的内存
currentNode=NULL;
m_iLength--; //节点长度减1
return true;
}
头结点不用删除。
后面用的Node *currentNode=m_pList是用来保存一下头结点。
通常带有头节点的不算做第一个节点,他只是指向第一个节点;
从零开始计数,k=0时 currentNode=currentNode->next被赋值后的current Node就是头节点指向序号是0的节点 ;
应该时节点的序号,0,1,2 ... i;
老师讲的单链表是有表头结点的,表头结点并不存储数据,只是一个牵头作用,方便我们通过它来寻找到链表的其他所有元素。因此单链表的元素个数也不把它包括在内,第0个结点就是表头结点的下一个结点。希望对你有所帮助~
老师是这么说的,比如你要在主文件的函数中调用插入节点的函数,在主文件的函数中声明一个Node node对象,一般在函数中申请变量都是在栈中申请,不会在堆中,在栈中申请的对象在函数执行完成后就销毁了,可以节约内存资源。这时你把这个node对象的地址传入插入节点的函数中,插入节点函数只需要拿到这个node对象中的值,然后自己去堆中申请内存。 如果你直接引用传进来的node对象,这个对象在外面函数执行完成后被系统销毁了,刚插入的值不复存在,就会引发错误,
头结点前不能插入,因为它data为空,没有意义吧。头结点后面的第一个数据算0号数据,listinserthead函数是插在头结点后面的,遍历出来结果显示它的数据在第一个位置上。头结点data为空,但是指针不为null,它前面不能插入数据。最后一个结点data不为空,指针为null,它的前后都可以插入数据。get函数中不算头结点,i最小为0,这就是头结点后面的第一个数据,即0号数据,头结点data为空,或者说没有意义,所以不能get 出来。
当前指针指向下一个节点,要记录当前指针,一边插入、删除操作,
一步一步来的,由浅入深
定义的临时结点指针currentNode经过循环之后指向链表的尾结点,因为它是指针变量,存放的是尾结点的地址,所以通过它来改变链表本身尾结点的指向是完全行得通的。即currentNode->next = NewNode 就等效于链表自己的指向尾节点的节点的next指向newNode!希望对你有所帮助~