LinkList* changeList(LinkList* L) {
LinkList* pl,pre,p, *q;
if (L->next == NULL) {
printf("该链表为空");
}
pl = L->next;
pre = pl;
p = pl->next;
while (p != NULL) {
q = p->next;
if (p->data >= pl->data) {
pre = p;
p = q;
}
else {
//断掉所需前移节点的前驱链
pre->next = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
return L;
}
这个方法是实现,将值小于第一个元素的节点放在第一个节点之前,大于的不变,仍在之后,我总感觉pre指针是不是有点多余了,感觉只需要三个指针就够了
代码测试过吗, p不是个指针吧, 还是是你排版问题?
while (p != NULL) {
应该是排版问题,pre,p都是指针
@新手小白。: 你这代码写的有问题
while (p != NULL) {
q = p->next;
@jakio6: 这块为啥有问题
@新手小白。: 不好意思是我有问题 😦 吐了
@jakio6: 我总感觉Pre这个指针没啥用,但是书上是这样写的,所以不太理解
@新手小白。: q可以去掉.
@jakio6: q不是防止这个链断的吗,把p拆下来时,p后面的链不是就断了,还是pre是防止链断的
@新手小白。:
有这个不是
pre->next = p->next;
@jakio6: 这个是不就是跨过p当前指向的节点,跟他后面的那些节点连起来,防止链断
@新手小白。: 什么意思
@jakio6: 他这个pre是不是就是连接上p这个节点的下一个节点
@新手小白。: 你是说这个语句还是pre这个变量的作用?
@jakio6: pre这个指针的作用
@新手小白。: pre是为了能够移除p
@jakio6: 没太懂。。。
@新手小白。: 要个链表一个节点移除掉得要能访问到这个节点前一个节点的next
@jakio6: 懂了,原来是这个意思,那q节点的作用是不是为了让p节点移动
@新手小白。: q没用
@jakio6: 那如何让p节点向后移动
@新手小白。: p是个指针, p = pre->next
就行了
@jakio6: LinkList* changeList(LinkList* L) {
LinkList* pl,pre,p;
if (L->next == NULL) {
printf("该链表为空");
}
pl = L->next;
pre = pl;
p = pl->next;
while (p != NULL) {
if (p->data >= pl->data) {
pre = p;
p = pre->next;
}
else {
//断掉所需前移节点的前驱链
pre->next = p->next;
p->next = L->next;
L->next = p;
p = pre->next;
}
}
return L;
}
改完之后,这个就陷入死循环了
@新手小白。: 不应该啊, 这个和之前那个应该是等价的
@jakio6: 我也觉得没啥问题,但是一运行就这样了
@新手小白。: 你测试的代码是不是不一样, 不然要是在这个函数里死循环哪里来的输出
@jakio6: 我也不太懂,我输入的3 2 1,然后就这样了。。。
@新手小白。: 没改之前没有问题吗?
@jakio6: 没问题,都正常
@新手小白。: 改回去试下
@jakio6: 我的问题,运行成我写的一个错误方法了。。。不好意思。你那个没有任何问题
@新手小白。: 😃
@jakio6: 实在抱歉,我在问最后一个问题,实在麻烦你了
@jakio6: //逆置方法
void ReverseList(LinkList* L) {
LinkList* p, * q;
p = L->next;
L->next = NULL;
while (p!= NULL) {
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
我这个方法要实现的把这个链表逆置,本质也是删掉节点,前插,为何这个不需要找前驱节点
@新手小白。: 这个只用删
@新手小白。: 一直是移除第一个节点
@jakio6: 懂了。真的万分感谢!!!