key:
1. 定义三个指针,cur;newhead;cur的前一个结点 pre
2.判断最后一个结点,直接赋值给newhead
*** 如果是双向链表,就是多了一步往前的指针处理
**** 如果是将二叉搜索树转换成有序的双向链表,也是一样的:中序遍历 + 根节点处的指针转换;
同时要注意对于参数pre,要用*&
解释:指针是一个存放地址的变量,而指针引用指的是这个变量的引用,众所周知C++中如果参数不是引用的话会调用参数对象的拷贝构造函数,所以如果有需求想改变指针所指的对象(换句话说,就是要改变指针里面存的地址),就要使用指针引用,
参考链接:https://www.cnblogs.com/jiasq/p/8637982.html
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL) return NULL;
ListNode* cur = pHead;
ListNode* newhead = NULL;
ListNode* pre = NULL;
while(cur){
ListNode* temp = cur->next;
if(temp == NULL) newhead = cur;
cur->next = pre;
pre = cur;
cur = temp;
}
return newhead;
}
};
DoubleNode* reverseList(DoubleNode *head)
{ //双向链表
DoubleNode *pre = NULL;
DoubleNode *next = NULL;
while(NULL != head)
{
next = head->next;
head->next = pre;
head->pre = next; //多了一步前置处理
pre = head;
head = next;
}
return pre;
}
//二叉搜索树 转换为有序的双向链表
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
TreeNode* pre = nullptr;
dfs(pRootOfTree,pre);
TreeNode* res = pRootOfTree;
while(res->left) res = res->left;
return res;
}
void dfs(TreeNode* cur,TreeNode*& pre){
//必须要加取地址的操作,因为pre是动态变化的,如果不加的话,调用结束后很可能pre没有变化,一直为空
if(cur == nullptr) return;
dfs(cur->left, pre);
cur->left = pre;
if(pre) pre->right = cur;
pre = cur;
dfs(cur->right, pre);
}