今天继续来闲话几句数据结构之单链表,题目的意思是删除链表中的特定元素,想来想去用C/C++ 来coding,才能更深刻的理解数据结构,故而以后在关于数据结构方面,我尽量用c/c++ 来coding。
看例子:
Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5
删除链表中所有与目标元素相等的元素。
分析:链表删除元素过程中,我们要free掉节点,释放内存空间,那么头尾节点该如何处理呢?
1. 如果删除的节点处于链表中间,那么很容易解决,直接将当前节点的node->next 指向下一个节点即可。
2. 如果删除的节点为头结点的话怎么办,或者我们需要改变头结点,返回的头结点我们应该做何处理。那么现在我们直接按照这个思路来code。
struct ListNode* removeElement(struct ListNode* head, int val)
{
if(head == NULL)
return head;
struct ListNode *p,*q,*tmp;
// 处理val为头结点的情形
q=p=head;
while(p!=NULL && p->val == val){
q=p;
p=p->next;
free(q);
}
struct ListNode *result = p ; //记录当前的头结点
// 处理val 在链表中间的情况,循环检索
while(p){
if(p->next && p->next->val == val){
tmp = p->next;
p->next = p->next->next;
free(tmp);
continue;
}
p = p->next;
}
return result; // 注意头结点可能会改变不再是head了。
}
接下来我们再看看二叉树对称问题:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3] is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3] is not:
1
/ \
2 2
\ \
3 3
老规矩我们先来按递归的方法来分析:
1.二叉树对称,要求左右子树都相等。
看code。
bool isSymmetric(struct TreeNode* root) {
if(root == NULL)
return true;
else
return isSame(root->left,root->right);
}
bool isSame(struct TreeNode* lnode,struct TreeNode* rnode){
if(lnode == NULL && rnode == NULL){
return true;
} else if(lnode == NULL && rnode !=NULL || lnode!=NULL && rnode == NULL){
return false;
} else {
return lnode->val == rnode->val && isSame(lnode->left,rnode->right) && isSame(lnode->right,rnode->left);
}
齐活了,注意大家能否思考下,二叉树对称的问题呢