您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法学习--链表

2012-11-12 15:52 513 查看
链表分为单链,双链和循环链表,链表C语言实现:






//单链
typedef struct NodeType
{
  char elem;
  NodeType * next;
} Node;

//双链
typedef struct DuobleNodeType
{
  char elem;
  NodeType *next;
NodeType *prev;
}DoubleNode;







1.单链表反转。

以微软的一道面试题为例,编写一个函数,给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。

给出反转函数:



Node* LinkList_reverse(Node* head)
{
Node *preNode,*curNode,*nextNode;

if(head==NULL) return NULL;//空链表

if(head->next == NULL) return head;//仅一个元素

curNode = head;preNode=NULL;//初始化

while(curNode)
{
nextNode = curNode->next;//先记录下一个结点
curNode->next = preNode;//改变链表方向(逆置)
preNode = curNode;//将当前结点作为下一次循环的前一个结点
curNode = nextNode;//向后推移一个结点
}

return preNode;//当遍历完链表后curNode应该为空,此时preNode链表头(head)
}




2.链表添加节点



//在给定的节点前插入新节点
void LinkList_Add(Node* ptr,Node* newNode)
{
int temp = 0;
newNode->next = ptr->next;
ptr->next = newNode;
temp = ptr->e;
ptr->e = newNode->e;
newNode->e = temp;
}




3.无头链表删除给定节点

同样以一面试题为例

假设一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(非第一个或最后一个节点),请将该节点删除。



//删除节点
void LinkList_Delete(Node* ptr)
{
Node* temp = ptr->next;
if(temp != NULL)
{
ptr->e = temp->e;
ptr->next = temp->next;
delete temp;//这里delete好像有问题,以后再看下
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: