在解析这个函数的实现时,我们先来回顾下函数:
Reverse Linked List 。
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL)
return head;
struct ListNode* p = head;
head->next = null;
p = head ->next;
while(!p){
struct ListNode* tmp = p->next;
p->next = head;
head = p;
p = tmp;
}
return head;
}
这个函数的理解比较简单,就是拿两个指针,head,p 不停的往后扫面,指针非空,则进行指向倒转,这里要注意头指针的,head->next = NULL应该是置空值。
现在看看第二种情况:
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
分析如下:
这个比之前那个稍微复杂一点,是从链表中间的某个节点开始到另一个节点,要进行倒转操作。代码如下
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
if(head == NULL)
return head;
struct ListNode* q = NULL;
struct ListNode* p = head;
//1.寻找需要倒转链表的首节点,注意位置关系
for(int i = 0 ;i< m-1 ;i++){
q=p;
p = p->next;
}
struct ListNode* end = p;
struct ListNode* pre = p;
p = p->next;
for(int i = m+1;i<=n;i++){
struct ListNode* tmp = p->next;
p->next = pre;
pre = p;
p = tmp;
}
end->next = p;
if(q)
q->next = pre;
else
head = pre;
return head;
}
二叉树的翻转:
如何翻转二叉树
4
/ \
2 7
/ \ / \
1 3 6 9
4
/ \
7 2
/ \ / \
9 6 3 1
此题目因为Max Howell 而名声大噪,因为Max Howell不会,直接被谷歌拒绝了,更深层次的原因请读者们自行google。
这里我们会采用两种方法来实现,第一,递归。第二,BFS
struct TreeNode* invertTree(struct TreeNode* root) {
if(root == null)
return ;
// 设定一个tmp 进行互换
struct TreeNode* tmp = root.left;
root->left = root->right;
root->right = tmp;
// 左子树递归
invertTree(root->left);
// 右子树递归
invertTree(root->right);
}
接下来我们采用层次遍历方法(BFS)来实现,因为要用到队列,所以这里我们用C++,代码来写
TreeNode* invertTree(TreeNode* root) {
if(root == null)
return root;
queue<TreeNode*> tree_queue;
tree_queue.push(root);
while(tree_queue.size() > 0){
// 取出队列头元素
TreeNode* pNode = tree_queue.front();
// 弹出队列头元素
tree_queue.pop();
// 设置pleft 存放当前节点的左子节点
TreeNode* pleft = pNode->left;
// 左子节点换成右子节点
pNode->left = pNode->right;
// 右子节点换成左子节点
pNode->right = pleft;
// 判断再将当前左子节点放入队列
if(pNode->left)
tree_queue.push(pNode->left);
// 将当前右子节点放入队列,因为队列是先进先出的,
// 下一个循环中,首先弹出的元素肯定也是左子节点元素
if(pNode->right)
tree_queue.push(pNode->right);
}
return root;
}
好了,齐活,链表的翻转,与二叉树的翻转解析到此了。