题目描述:
37题:递增的单链表,去掉表中重复的元素,只保留一个数值
38题:判断带头结点的双循环链表是否对称
思路:
37题:用一个变量val存入当前节点的值,向后遍历,因为为递增的链表,则重复值都相连。若遍历到的相同元素结点则删除,遍历到不同值就更新变量,每次删除结点后,长度减一;
38题:定义双指针,一个从头向后遍历链表,一个从尾部向前遍历,每次对比其中元素,不同则返回错误,相同继续遍历,直到两指针相遇或者p走到了q的后面(也是q走到了p的前面),此时返回true
具体实现:
//37题、递增的单链表,去掉表中重复的元素,只保留一个数值(带头结点)
void DeletRepetiElem(SqList &L , int &len)
{
if(len <=1 ) return; //当链表只有一个结点时,无重复值,直接返回
ListNode* p = L->next->next; //从第二个结点开始遍历
int val = L->next->data;//val用于记录当前值作比较以找出重复值,将第一个节点值赋予val
for (int i=1 ; i<len && p!=NULL ; i++)
{
if(p->data == val){//如果节点值和之前值一样的话就删除结点
ListDelet(p); //删除p结点且令p指向下一结点
len--;}
else {
val = p->data;
p = p->next;} //否则将val的值更新为p结点值,p结点指向下一个
}
return;
}
//38题、判断带头结点的双循环链表是否对称
bool SemmetryList(DLinkList L)
{
//定义双指针相向遍历链表
DNode* p = L->next; //p指针从头 向后遍历
DNode* q = L->prior; //q指针从尾 向前遍历
while(p!=q && p->prior!=q) //p和q相遇 或者q走到了p的前面,循环结束
{
if(p->data == q->data)
return false; //若不相等,则返回错误
p=p->next;
q=q->prior;
}
return true;
}
小结:
这次没写主函数,