题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnnhm6/
1、利用头插法实现链表的反转,从链表第一个节点开始,当前节点作为新的头结点,一直到链表结束。
上图:
main函数代码:
#include<stdio.h>
#include<stdlib.h>
// 结构体
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode* head);
int main(){
// 动态申请5个节点
struct ListNode *lnode1 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode4 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode5 = (struct ListNode *)malloc(sizeof(struct ListNode));
// 初始化链表
lnode1->val = 1;
lnode2->val = 2;
lnode3->val = 3;
lnode4->val = 4;
lnode5->val = 5;
lnode1->next = lnode2;
lnode2->next = lnode3;
lnode3->next = lnode4;
lnode4->next = lnode5;
lnode5->next = NULL;
struct ListNode *head = reverseList(lnode1);
while(head!=NULL){
printf("%d ",head->val);
head = head->next;
}
}
链表反转代码:
struct ListNode* reverseList(struct ListNode* head){
// 链表的新头指针
struct ListNode *newHead = NULL;
// 临时指针存储下一个节点
struct ListNode *temp = NULL;
// 头插法逆转矩阵
while(head!=NULL){
// 保存后边的节点防止丢失
temp = head->next;
// 头结点连接后边的节点
head->next = newHead;
// 指向新的头结点
newHead = head;
// head往后走
head = temp;
}
// 返回新的头结点
return newHead;
}
2、反转可以通过栈来实现,就可以通过递归的方式来实现 递归需要有终止条件和调用本身
递归方式实现反转:
struct ListNode* reverseList(struct ListNode* head){
//递归结束条件
if(head==NULL||head->next==NULL){
return head;
}
// 调用函数本身
struct ListNode* newHead = reverseList(head->next);
// 反转节点
head->next->next = head;
// 尾节点置NULL
head->next = NULL;
// 返回上一层
return newHead;
}