理解这个逻辑的前提是:这个L节点(头结点)是不存储数据的,也就是说从L->next开始存储数据。
假如链表中存了1 2 3 4 5这5个数据,1存储在L->next节点中,而不是L节点中。
所以逆序后,L这个节点仍然是逆序后的链表的头结点,因为这个节点并不实际存储数据。
实际的逆序是从L->next这个节点开始的。
好的,下面来看看这个逻辑:
L是头结点
p = L->next; p是第二个节点
L->next=NULL;把头结点的next设为空
进入while循环后:
q = p->next; q是原链表的第三个节点
p->next = L->next; 此时,L->next=NULL;也就是把第二个节点的next置为NULL,
因为第二个节点逆序后,是链表的最后一个节点
L->next = p; 让头结点的next指向p(逆序后的尾结点),此时链表中只有L和p两个节点
p = q; //p变成原来链表的第三个节点
进入下一次循环
q = p->next; q是原链表的第四个节点
p->next = L->next; 原链表的第三个节点的next指向L->next,此时L->next是原链表的第二个节点,
L-next = p; 头节点的next指向p,
到这里看明白了吗,经过这几个步骤以后,链表中有三个节点,也就是原链表的前三个节点
头结点L还是原来的头结点,现在的第二个节点变成了原链表的第三个节点,
原链表的第二个节点变成了现在的第三个节点(尾结点)
也就是相当于把原链表的第三个节点,插入到第一个节点和第二个节点之间了。
这下明白了吧。
整个逻辑就是,L还是头结点,原来的第二个节点逆序后变成了尾节点,其他的节点逐个往L节点后面插,
每次都是插入到L后面,这样整个链表就实现了逆序。
所以,如果不理解L节点不存储数据这个前提,是理解不了这个逻辑的。
如有帮助,请帮忙采纳一下,谢谢。