问题: 就地逆置链表[空间复杂度为O(1)]
思路:
其实很简单,只要把链表中的
->
全都变成<-
就行了
然后再给最后一个结点整个表头就搞定了。
问题是怎么把->
变成<-
直接上代码
typedef struct ListNode {
int data;//数据域
ListNode *next;//指针域
}ListNode, *LinkList;
注意ListNode和*LinkList的区别
ListNode a;//代表顶一个一个ListNode数据类型的变量,名字叫a
ListNode *b;
//代表定义一个指向ListNode数据类型的指针,这个指针的名字叫b
//而且这个指针只能指向ListNode这个数据类型的变量
LinkList c;//a就是一个指针,一个指向ListNode类型的指针。
//所以
b = c;//这样是没问题的,指针赋值
a = c;//这样写是不行的,一个是指针,一个是ListNode,俩不是一个数据类型,不能赋值
//代表这个函数返回值是一个指针类型
LinkList Reverse(LinkList &L) {
ListNode *cur = L, *tmp, *pre;
pre = NULL;
//首先让pre为NULL,因为逆置以后,原来链表的第一结点就成了尾结点,
//它被逆置以后是要指向NULL的
while (cur != NULL) {
tmp = cur->next;
//首先,tmp保存cur的下一个结点,如果没有tmp下一轮循环就找不见后面
//还没有逆置的剩余链表了
cur->next = pre;
//当前cur指向的结点,让他指向他前面的结点,
//这时候他就和他后面的结点断开了,上面已经有tmp指向了后面的结点
//所以所以再后面让cur=tmp就成了
pre = cur;
//这个结点翻转过去以后,他本身就成了后一个结点的前一个节点了,
//只要是前一个结点,都叫pre
cur = tmp;
//现在翻转tmp这个结点,所以cur就指向tmp所指向的结点
}
return pre;
}