zoukankan      html  css  js  c++  java
  • 数据结构与算法学习链表

    链表分为单链,双链和循环链表,链表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好像有问题,以后再看下
        }
    }
    复制代码
     
     
    标签: 数据结构算法
  • 相关阅读:
    linux基本命令
    Linux中常用的50个命令
    Selenium2之XPath定位
    Selenium2浏览器启动及配置
    python学习内容.05
    python学习内容.04
    python学习内容.03
    python学习内容.02
    python学习内容.01
    RESTful
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2766462.html
Copyright © 2011-2022 走看看