与数组不同,链表的大小是不固定的,可以根据需要增长其规模,同时,插入与删除数据也比较快。
1.结点是链表的基本单元,结点的定义为
struct Node{
int item;
Node* next;
};
2.在链表的尾部增加数据非常简单,只需要把最后一个节点的指针指向要增加的结点处即可。
void AddData(Node* head,int value){
if(head == NULL){
(head)->item = value;
(head)->next = NULL;
}
Node* pnew = new Node;
pnew->item = value;
while((head)->next != NULL){
head = (head)->next;
}
(head)->next = pnew;
pnew->next = NULL;
}
3.在删除结点是,应该把当前结点curr的前一个结点prev的指针指向curr的next。注意,当要删除的结点是第一个结点时,由于prev为NULL,因此要特殊处理,直接修改head。删除掉的结点还应当delete。
Node* DeleteData(Node* head,int value){
if(head == NULL){
return NULL;
}
Node* prev = new Node;
Node* curr = new Node;
if(head->item == value){
curr = head;
head = head->next;
}
else{
for(prev = NULL,curr = head; (curr!= NULL) ;prev = curr, curr = curr->next ){
if(curr->item == value){
prev->next = curr->next;
break;
}
}}
delete curr;
curr = NULL;
return head;
}
这一部分测试代码:
int main()
{
Node* head;
head = NULL;
Node* p1 = new Node;
Node* p2 = new Node;
Node* p3 = new Node;
head = p1;
p1->item = 2;
p1->next = p2;
p2->item = 5;
p2->next = p3;
p3->item = 7;
p3->next = NULL;
AddData(head,8);
AddData(head,10);
for(Node* prev = head; prev != NULL;prev = prev->next)
cout << prev->item << endl;
//cout << "head" << head->item << endl;
return 0;
}
4.要复制一整个链表不是简单地复制head(浅拷贝)就行,而应该所有的结点一起复制(也即深拷贝)。
Node* ListCopy(Node* head){
if(head == NULL)
return NULL;
Node* newhead = new Node;
newhead = head;
Node* temphead = newhead;
Node* newnode = new Node;
while(head->next != NULL){
newnode = head->next;
//Node* temphead = newhead;
temphead->next = newnode;
head = head->next;
temphead = newnode;
}
temphead = NULL;
return newhead;
}
5.寻找链表指定下标的结点。
Node* ListFind(int index,Node* head){
if(head == NULL)
return NULL;
if(index < 1 )//还应该有一个小于等于长度的条件,但目前还未实现
//相应的长度函数,因此先默认不会大于链表的长度
return NULL;
Node* curr = head;
for(int num = 1; num != index; ++num){
curr = curr->next;
}
return curr;
}