C++数据结构------链表
体会引用的强大,
定义一个Node 存放一个data和指向下一个节点的指针next;
定义一个类 存放链表的头指针
typedef int T;
struct Node{
T data;
Node* next;
Node(const T& d=T()):data(d),next(NULL){}
};
class List{
Node* head;
};
插入删除一个节点:获取某个成员的成员指针,引用!
经典insert&&getptr函数:
Node*& List::getptr(int pos)//返回第K个成员的成员指针引用!
{
if(pos>size()||pos<0) return head;
if(pos==0) return head;
Node* p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
return (*p).next;
}
void List::insert(const T& d,int pos)
{
Node*& pn = getptr(pos);//注意引用!一直引用!
Node* p=new Node(d);
p->next = pn->next;
pn=p;
}
链表提供增删查改功能,注意内存释放clear()
void List::clear()
{ while(head)
{
Node* p=head->next;
delete head;
head=p;
}
}
删除节点:
假设删除第K个节点,getptr()获得指向第K个节点的指针的引用pn,
ptemp=pn;
delete ptemp;//释放第K个节点.
pn=pn->next;
倒置一个链表:
我的算法:开辟数组Node* ptr[size()],遍历链表依次将各个指向节点的指针存放到数组中,循环交换 size()/2 次节点的data。
Node* ptr[len];
for(i=1;i<len;i++)
ptr[i]=ptr->next;
for(i=0;i<len/2;i++)
SWAP(ptr[i]->data,ptr[len-i-1]->data);
SWAP交换实现:int a,b;a^=b;b^=a;a^=b;巧用异或运算。