leet206_翻转列表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
    int val;
    struct ListNode *next;
  }ListNode;
/*
逐个断开原链表的每个节点(保存下个节点)
将断开的节点连接到反转链表的表头上
更新反转链表的表头
回到原链表的下个节点
*/
struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* p= NULL ;      //前向遍历节点
    struct ListNode * tmp;         //新建工作节点
    while(head){
        tmp = head->next;
        head->next = p;
          p = head;
          head = tmp;       ///head后移一个位置

    }

    return p;
}

int main(){

  ListNode * h = (ListNode*)malloc(sizeof(ListNode));  ///节点不存放数据
  h->next = NULL;


  ListNode * p = h,*q; ///工作节点

  ///初始化一个测试用例5个元素(创建链表过程后插法&前插法)
  for(int i=1 ; i<=5; i++){
        ///创建并且初始化一个结点
        q = (ListNode *)malloc(sizeof(ListNode));
        q->val = i;
        q->next = NULL;

        ///后插法
        p->next = q;
        p = p->next;
        ///前插法
  }

    q = reverseList(h);
    for(int i=1 ; i<=5; i++){
    printf("%d",q->val);
    q = q->next;

  }


    return 0;
}
发布了46 篇原创文章 · 获赞 1 · 访问量 5735

猜你喜欢

转载自blog.csdn.net/Happy_Yu_Life/article/details/104575988
206
今日推荐