链表反转

题目很简单,一个单向链表,把尾指针指向前一个元素而不是后一个元素。如下

下面生成的是1,2,3,4,5,6。要求把它倒过来,尾部指向上一个节点,能够反向输出数据。

      typedef struct Node{
          int data;
          struct Node * next;
      }Node; //链表节点
       int a[] = {1,2,3,4,5,6};
        Node * item = (Node*)malloc(sizeof(Node));
        item->data = a[0];
        Node * head = item; //链表头部
        Node * p = item;//临时节点
        for (int i = 1; i<sizeof(a)/sizeof(int); i++) {
            Node * item = (Node*)malloc(sizeof(Node));
            item->data = a[i];
            p->next = item;
            p = p->next;
        }
        Node * start = head;
        while (start!= NULL) {
            printf("%d ",start->data);
            start = start->next;
        }
  1. 利用栈的知识

思路很简单,实现起来也很简单,一次访问链表的每个节点,放入栈里面,然后将每个节点依次出栈,取出栈顶的元素放在已经出栈的元素的后面。这个感觉实现起来很简单,很容易想到。缺点就是需要分配额外空间,用两次循环。

  1. 一次循环解决

每次都只看两个节点。只考虑把后面的节点的next指针指向前一个,然后两个节点同时向后移动一位,暂时不考虑第一个节点的next,把第一个节点单独处理,不然很难统一处理。

       start = head;  //head是已经构建的链表的头部
        Node * pre = start; //前一个节点
        Node * next = start->next;//后一个节点
        while (pre&&next) {
            p = next->next;//先取到后一个节点的下一个节点,否则无法找到位置进行移动
            next->next = pre;//后一个节点指针指向前一个
            pre = next;//前一个节点后移一位
            next = p;//后一个节点后移一位
        }
        start->next = NULL;//这个要赋值为NULL,否则会和原来的第二个节点形成一个环。
        while (pre) {
            printf("%d ",pre->data);
            pre = pre->next;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容