一、题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
二、思路
头插法
构造一个虚拟头结点,从给定的头结点进行后删操作,删除出来的元素在虚拟头结点进行后插操作
迭代
相当于遍历一次链表,然后每次遍历的时候把当前的next域指向前一个节点,需要用一个节点来存储next域的信息防止指针丢失
三、C语言解法
- 头插法逆置
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int deleteNext(struct ListNode* node){
int val=node->next->val;
node->next=node->next->next;
return val;
}
void insertNext(struct ListNode* node,int val){
struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
p->val=val;
p->next=node->next;
node->next=p;
}
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *vhead = (struct ListNode *)malloc(sizeof(struct ListNode));
int temp,count = 1;
int * arr = NULL;
if(head == NULL) return NULL;
vhead->next=head;
while(head!=NULL&&head->next!=NULL){
temp = deleteNext(head);
insertNext(vhead,temp);
}
return vhead->next;
}
- 迭代法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)return NULL;
struct ListNode *front,*p,*temp;
front = head;
p=front->next;
if(p==NULL) return head;
temp=p->next;
front->next=NULL;
while(temp!=NULL){
p->next=front;
front = p;
p = temp;
temp = p->next;
}
p->next=front;
return p;
}