- 基础题:逆置/反转单链表,要求只遍历一次链表
解题思路:定义三个指针:
代码:
void Reverse(ListNode*& l)
{
assert(l);
ListNode* cur = l;
ListNode* tmp = NULL;
ListNode* next = NULL;
while(cur)
{
next = cur->_next ;
cur->_next = tmp;
tmp = cur;
cur = next;
}
l = tmp;
}
- 查找单链表的倒数第K个结点,要求只遍历一次链表。
代码:
ListNode* FindK(ListNode* l,int k)
{
if(l == NULL || k == 0)
return NULL;
ListNode* fast = l;
ListNode* slow = l;
while(fast && k)
{
fast = fast->_next;
--k;
}
while(fast)
{
fast = fast->_next;
slow = slow->_next;
}
return slow;
}
- 附加题:实现一个Add函数,让两个整数相加,但是不能使用+、- 、* 、/等四则运算符。ps:也不能用++ 、 – 等等。
思路:
可以看出此题要用到位运算,加法的话由两部分组成:
按位相加和,进位;
按位相加且不考虑进位时:1加1结果为0,1加0为1,0加1结果为1,0加0结果为0,通过推理可得这个可用位运算的异或来代替;
进位:主要是当两个数的同一位都为1时,会向它的前一位进1;
两个数的同一位都为1时结果为1;可以用与运算;将结果左移一位相当于进位;
代码实现:
int Add(int a,int b)
{
int sum = 0; //按位和
int carry = 0; //进位
do
{
sum = a ^ b;
carry = (a & b) << 1 ;
a = sum ;
b = carry ;
}
while(b != 0);
return sum;
}