单链表之逆序

1.单链表的逆序就是将所以节点逆序过来
解决思路:先遍历所有节点,然后将第一个节点的pNext指向NULL,将第二个节点的pNext指向原来的第一个节点,也就是pH的pNext,并把头节点的pNext指向头插入过来节点的首地址。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//构建链表节点
struct node
{
        int data;       //有效数据
        struct node *pNext;     //指向下一个节点的指针

};


//函数功能,创建链表节点
//返回值:指针,指向我们本函数新创建的一个节点的首地址
struct node *creat_node(int data)
{

        //创建一个链表节点
        struct node *p = (struct node *)malloc(sizeof(struct node));
        if(NULL == p)
        {
                printf("malloc error\n");
                return NULL;
        }


        //清理申请到的堆内存
        // void bzero(void *s, size_t n);
        bzero(p,sizeof(struct node));

        //填充节点
        p->data = data;
        p->pNext = NULL;       //将来要指向下一个节点的首地址

        return p;
}

/重头部加入新节点
void insert_head(struct node *pH,struct node *new)
{
         
        //第一步:新节点的pNext指向第一个节点
        new->pNext = pH->pNext;
        //第二部:头结点的pNext指向新节点
        pH->pNext = new;
        //第三部:头结点的计数加1
        pH->data += 1;

}

//单链表遍历函数,pH为单链表的头指针,遍历的节点数据打印出来(无头结点遍历)
void bianli(struct node *pH)
{
        //struct node *p = pH;  头指针后面是头节点这样初始化下面会打印头结点的数据
        struct node *p = pH->pNext;

        printf("开始遍历==================\n");

        //pH->data;     //头结点的数据,不算链表的常规数据
        while(NULL != p->pNext)
        {
                printf("node data = %d\n",p->data);
                p = p->pNext;
        }

        printf("node data = %d\n",p->data);     //这种方法解决了最后一个节点内内打印不出来的问题,但效果不好
        printf("遍历完成==================\n");


}

//有头节点遍历
void bianli2(struct node *pH)
{
        struct node *p = pH;  //头指针后面是头节点这样初始化下面会打印头结点的数据

        printf("开始遍历==================\n");

        while(NULL != p->pNext)
        {
                p = p->pNext;
                printf("node data = %d\n",p->data);
        }

        printf("遍历完成==================\n");
}

//将pH指向的链表逆序
void reverse_linklist(struct node *pH)
{
        struct node *p = pH->pNext;     //
        struct node *pBack;

        if((NULL == p) || (NULL == p->pNext))//当链表没有有效节点或只有一个有效节点直接返回
        {

                return;
        }

        while(NULL != p->pNext) //判断是不是最后一个节点
        {
                pBack = p->pNext;       //保存p节点后面一个节点的地址
                if(p == pH->pNext)      //判断是否为链表的第一个有效节点
                {
                        p->pNext = NULL;
                }
                else
                {
                        p->pNext = pH->pNext;
                }
                pH->pNext = p;
                //p=p->pNext;      这里不能这样写,因为p->pNext在前面已经改变,p和p->pNext已经失去联系
                p = pBack;
        }

                insert_head(pH,p);	//将最后一个节点打印出来


}

int main(void)
{
        //定义头指针
        //struct node *pHeader = NULL;  这里如果把pHeader赋值为NULL在加入节点这个函数内就会出现段错误
        struct node *pHeader = creat_node(0);

        insert_head(pHeader,creat_node(1));

        insert_head(pHeader,creat_node(2));

        insert_head(pHeader,creat_node(3));


        printf("header node data = %d\n",pHeader->data);        //打印有多少个节点

        //bianli(pHeader);
        printf("逆序前================\n");
        bianli2(pHeader);
        reverse_linklist(pHeader);
        printf("逆序后================\n");
        bianli2(pHeader);

        return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 通常来说,单链表逆序输出可以通过遍历链表,并对链表中的每个元素进行重新排序实现。首先,从链表的头结点开始遍历,然后将每个节点依次插入到新链表的头部,最后将新链表的头结点赋值给原链表的头结点,从而实现逆序输出。 ### 回答2: 单链表逆序输出可以通过遍历链表并使用递归或栈来实现。 1. 使用递归实现单链表逆序输出: 递归函数可以在链表访问到最后一个节点后开始返回并输出节点的值,然后再一层一层返回并输出之前的节点的值。 例如,假设链表的节点如下: ``` class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; this.next = null; } } ``` 递归函数如下: ``` public void reversePrint(ListNode head) { if (head == null) { return; } reversePrint(head.next); System.out.print(head.val + " "); } ``` 通过调用 `reversePrint(head)` 函数即可逆序输出单链表的节点值。 2. 使用栈实现单链表逆序输出: 可以使用栈来保存链表节点的值,并在遍历链表时将节点的值依次压入栈中,最后再逐个弹出栈中的元素并输出。 例如,假设链表的节点如下: ``` class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; this.next = null; } } ``` 使用栈实现逆序输出的代码如下: ``` public void reversePrint(ListNode head) { if (head == null) { return; } Stack<Integer> stack = new Stack<>(); ListNode curr = head; while (curr != null) { stack.push(curr.val); curr = curr.next; } while (!stack.isEmpty()) { System.out.print(stack.pop() + " "); } } ``` 通过调用 `reversePrint(head)` 函数即可逆序输出单链表的节点值。 以上是两种实现单链表逆序输出的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值