链表是最基本的数据结构,也是面试中较为常见的问题,链表的一些基本操作功能是必须能够实现,下面是一些关于链表基本的操作。

       ——链表的节点设置

typedef int Datatype;
typedef struct SListNode
{
    Datatype data;      //数据域
    struct SListNode *next;         //next指针域
}SListNode;

    

      ——链表的基本操作

(1)删除一个无头单链表的非尾节点

(2)在无头单链表的一个非头结点前插入一个节点

(3)查找单链表的中间节点,要求只能遍历一次链表

(4)查找单链表的倒数第k个节点,要求只能遍历一次单链表

(5)从尾到头打印单链表(使用递归,压入堆栈)

(6)逆置单链表,不能创建节点


 
//利用头插法建立单链表
void Frontinsert(SListNode *&phead)
{
     SListNode *tmp = (SListNode *)malloc(sizeof(SListNode));
}
 
//删除一个无头单链表的非尾节点
void DelNonTailNode(SListNode *pos)
{
     assert(pos);
     assert(pos->next);    //非尾节点
     SListNode *del = pos->next;
     pos->data = del->data;
     pos->next = del->next;
     free(del);
}
 
 
//在无头单链表的一个非头结点前插入一个节点
void insertFrontNode(SListNode *pos, Datatype x)
{
     assert(pos);
     SListNode *tmp = _BuyNode(x);
     tmp->next = pos->next;
     pos->next = tmp;
     Datatype tmpdata = pos->data;
     pos->data = tmp->data;
     tmp->data = tmpdata;
}
 
//查找单链表的中间节点,要求只能遍历一次链表
SListNode * FindMidNode(SListNode * phead)
{
     SListNode *fast = phead;
     SListNode *slow = phead;
     while (fast)
     {
         if (fast->next != NULL)
         {
             fast = fast->next->next;
         }
         else
         {
             break;
         }
         slow = slow->next;
    }
    return slow;
}
 
 
//查找单链表的倒数第k个节点,要求只能遍历一次单链表
SListNode * FindKNode(SListNode *phead, Datatype k)
{
     SListNode *fast = phead;
     SListNode *slow = phead;
     while (fast && k--)
     {
          fast = fast->next;
     }
     if (fast == NULL)
     {
          return NULL;
      }
     while (fast)
     {
          fast = fast->next;
          slow = slow->next;
     }
     return slow;
}
 
 
//从尾到头打印单链表(使用递归,压入堆栈)
void printTailToHead(SListNode *phead)
{
     if (phead == NULL)
    {
         return;
     }
    else
    {
         printTailToHead(phead->next);
         printf("%d ", phead->next);
    }
}
 
 
//逆置单链表,不能创建节点
SListNode *Reverse(SListNode *phead)
{
      SListNode *cur = phead;
      SListNode *newhead = NULL;
      while (cur)
      {
           SListNode *tmp = cur;
           cur = cur->next;
           tmp->next = newhead; 
      }
      return phead;
}