异或运算符:^
异或运算符的特点:
1、满足交换律 a^b=b^a;
2、满足结合律 a^b^c=a^c^b;
3、任何数和零做异或运算,都得自身:a^0=a;
4、任何数和自己做异或得零:a^a=0;
常见链表处理方法总结:
链表中插入新节点步骤:
结点 p 之后增加一个结点 q 需要三步:
- 申请一段内存用以存储 q (可以使用内存池避免频繁申请和销毁内存)。
- 将 p 的指针域数据复制到 q 的指针域。
- 更新 p 的指针域为 q 的地址
Node q=new Node(q);
q.next=p.next;
p.next=q;
链表中删除节点步骤:
删除结点 p 之后的结点 q 总共分两步:
1、将q的指针域数据复制到p的指针域。
2、释放q的内存。
p.next=q.next;
q.next=null;
面试中链表问题总结:
获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度;
学会使用双指针思路:
获取倒数第k个元素问题:
双指针a,b;
开始时a不动,b沿着链表走k步;
然后a,b同时沿着链表走,直到b走到链表尽头,a指向节点就是倒数第k个节点。
获取链表中间元素问题:
快慢指针a,b;
每次a沿着方向走一步,b沿着方向走两步;
当b无法走两步时,a,b都停下,若链表为奇数,则a指向中间元素,若为偶数,a指向链表前半段最后一个元素。
判断链表中是否有环:
快慢指针a,b;
a每次走一步,b每次走两步;
若b无法走两步时,没有环;若a,b相遇时,有环;
如何判断环的长度?
两指针相遇后开始计数,再次相遇时走的步数就是环的长度;