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

链表分为单链,双链和循环链表,链表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好像有问题,以后再看下
    }
}
复制代码

 

 
 
标签:  数据结构算法

你可能感兴趣的:(数据结构,算法)