您的位置:首页 > 其它

day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算

2017-07-15 10:50 591 查看
逆置/反转单链表,要求只能遍历一次链表

struct Node
{
Node *next;
int value;

Node(int val):value(val),next(NULL){ }
};

//方式一:
void Reverse(Node *&phead)
{
if(phead == NULL || phead->next ==  NULL)
return ;

Node *pcur = phead->next;
Node *pre = phead;

while(pcur)
{
Node *pnext = pcur->next;
pcur->next = pre;
pre = pcur;
pcur = pnext;
}

phead->next = NULL;  //最后把指针域制空
phead = pre;
}

//方式二:用栈去实现逆置。

void  Reverse2(Node *&phead)
{
if(phead == NULL || phead->next == NULL)
return ;

stack<Node*> s;

Node *pcur = phead;
while(pcur->next) //此时pcur指向最后一个元素,也就是逆置后的首元素。
{
s.push(pcur);
pcur= pcur->next;
}

phead = pcur;
while(!s.empty())
{
Node *ptemp = s.top();
pcur->next = ptemp;
pcur = ptemp;
s.pop();
}
pcur->next = NULL;

}

void Reverse3( Node *&phead)
{
if(phead == NULL || phead->next == NULL)
return ;

Node *pNewHead = phead;
Node *pcur = phead->next;
pNewHead->next = NULL;  //先把头结点的指针域制空

while(pcur)
{
Node *pnext = pcur->next; //pnext = pcur->next这句话别放在最后面,放在最后面,pcur =pnext=NULL,此时pnext = NULL->next,程序崩溃。
pcur->next = pre;
pre = pcur;
pcur = pnext;
}

phead = pNewHead;
}


查找单链表的倒数第k个节点,要求只能遍历一次链表

struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL) { }
};

ListNode *FindKthToTail(const  ListNode *pListHead, int k)
{
assert(pListHead && k > 0);

const ListNode *pFast = pListHead;

while(k--)
{
if(pFast == NULL)
return NULL;
pFast = pFast->next;
}

const ListNode *pSlow = pListHead;
while(pFast)
{
pFast = pFast->next;
pSlow = pSlow->next;
}

return (ListNode*)pSlow;

}


实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等


//一个数相加分三步:5+17  第一步:各个位相加5+7=12,个位为2,1+0=1,十位为1,第二步做进位,5+7进位为10,第三步12+10=22(也就是重复一二步)

int Add(int num1, int num2)
{

while(num2 != 0) //进位不为0
{
int temp1 = (num1^num2); //各个位相加
int temp2 = (num1&num2)<<1; //进位
num1 = temp1;
num2 = temp2;
}
return num1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐