反转一个单链表。
示例:
输入: 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;
}