面试-算法-单链表逆序输出法

一、有几种方法

 

  1. 数组法,遍历链表每个元素存数组,然后逆序遍历数组输出
  2. 头插法,遍历链表将遍历到的元素插入链表头,然后重新遍历链表输出
  3. 栈输出,遍历链表将每个元素存入栈中,然后将栈元素全部出栈输出
  4. 递归法,遍历链表,非未节点则继续递归

二、实现

          数组法实现核心代码:

int array_rever(N *head)
{
    int i = 0;
    N *p = NULL;
    N **parray = NULL;
    int len = 0;

    len = length(head);
    if (len <=0)
        return 0;

    parray = (N**)malloc(sizeof(N*)*len);
    if (!parray)
        return -1;
    memset(parray, 0, sizeof(N*)*len);

    p = head;
    while(p)
    {
       parray[i++] = p;
       p = p->next;
    }

    //输出
    for(i=len-1; i >=0; i--)
    {
        printf("%d ", parray[i]->info);
    }

    free(parray);

    return 0;
}

头插法核心代码:

N *insertToHead(N *head)
{
    N *cur = NULL;
    N *rear = NULL;

    cur = head->next;
    head->next = NULL;
    while(cur)
    {
        rear = cur->next;
        cur->next = head;
        head = cur;
        cur = rear;
    }
    //输出 
    N *tmp = NULL;
    tmp = head;
    while(tmp)
    {
        printf("%d ", tmp->info);
        tmp = tmp->next;
    }

    return head;
}

栈输出核心代码:

linklist *back_linklist(linklist *head)
{
  linklist *p;
  InitStack(&s1);
  p = head->next;//p指向首结点

  while (p)
  {
    Push(&s1, p->data); //链表结点中的数据入栈
    p = p->next; //p指针后移
  }
  p = head->next;//p再指向首结点
  while (!StackEmpty(&s1)) //当栈s不空时
  {
    p->data = Pop(&s1); //数据出栈,并存入p所指结点的数据域
    p = p->next; //p指针后移
  }
  return head;
}

递归实现核心代码:

linklist *back_linklist(linklist *head)
{
    if (!head)
        return NULL;

    back_linklist(head->next);

    printf("%d ", head->data);
    return head;
}

总结:

     递归法耗缓存

     栈方法与数组方法区别不大

     效率最高的是头插法,通过改变指针来调整顺序

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值