1.由链表存储两个数字,计算这两个数字的和
如图所示:
链表从头至尾:个位、十位、百位……
#include<iostream>
typedef struct tagSNode{
int value;
tagSNode* pNext;
tagSNode(int v) : value(v), pNext(NULL){}
}SNode;
SNode *Add(SNode* pHead1, SNode* pHead2){
SNode* pSum = new SNode(0);
SNode* pTail = pSum;
SNode* p1 = pHead1->pNext;
SNode* p2 = pHead2->pNext;
SNode* pCur;
int carry = 0; //进位
int value;
while (p1 && p2){
value = p1->value + p2->value + carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur; //新结点链接到pTail的后面
pTail = pCur;
p1 = p1->pNext;
p2 = p2->pNext;
}
//处理较长的链
SNode* p = p1 ? p1 : p2;
while (p){
value = p->value + carry;
carry = value / 10;
value %= 10;
pCur = new SNode(value);
pTail->pNext = pCur;
pTail = pCur;
p = p->pNext;
}
//处理可能存在的进位
if (carry != 0)
pTail->pNext = new SNode(carry);
return pSum;
}
int main(){
int i;
SNode* pHead1 = new SNode(0);
for (i = 0; i<6; i++){
SNode* p = new SNode(rand() % 10);
p->pNext = pHead1->pNext;
pHead1->pNext = p;
}
SNode* pHead2 = new SNode(0);
for (i = 0; i<9; i++){
SNode* p = new SNode(rand() % 10);
p->pNext = pHead2->pNext;
pHead2->pNext = p;
}
Print(pHead1);
Print(pHead2);
SNode* pSum = Add(pHead1, pHead2);
Print(pSum);
Destory(pHead1);
Destory(pHead2);
Destory(pSum);
return 0;
}
2.有序链表删除重复数字
void DeleteDuplicateNode(SNode* pHead){
SNode *pPre = pHead->pNext;
SNode *pCur;
while (pPre){
pCur = pPre->pNext;
if (pCur && (pCur->value == pPre->value)){
pPre->pNext = pCur->pNext;
delete pCur;
}
else{
pPre = pCur;
}
}
}
int main(){
SNode *pHead = new SNode(0);
int data[] = { 2, 3, 3, 5, 7, 8, 8, 8, 9, 9, 10 };
int size = sizeof(data) / sizeof(int);
for (int i = size - 1; i >= 0; i--){
SNode *p = new SNode(data[i]);
p->pNext = pHead->pNext;
pHead->pNext = p;
}
Print(pHead);
DeleteDuplicateNode(pHead);
Print(pHead);
Destory(pHead);
return 0;
}