将链表反转,有两种方式,一是将链表节点的数值进行交换,而不改变链表节点顺序;二是交换链表节点顺序,而不改变链表节点的数值。两种方式都可实现反转效果。
数值反转方法是将两两节点的数值进行交换,通过双重循环实现
#include <stdio.h>
#include <stdlib.h>
struct ListNode{
int val;
struct ListNode *next;
};
struct ListNode *createLit(struct ListNode* head)
{
head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *p = head;
head->val = 1;
for(int i=1;i<5;i++)
{
struct ListNode *q = (struct ListNode *)malloc(sizeof(struct ListNode));
q->next = NULL;
q->val = i+1;
p->next = q;
p = q;
}
return head;
}
struct ListNode* reverseList(struct ListNode* head)
{
if(head == NULL)
return head;
struct ListNode *p = head;
struct ListNode *t = NULL;
while(head != t)
{
p = head;
struct ListNode *q = p->next;
while(q != t)
{
int v = p->val;
p->val = q->val;
q->val = v;
p = q;
q = q->next;
}
t = p;
}
return head;
}
void main()
{
struct ListNode* head = NULL;
head = createList(head);
head = reverseList(head);
p = head;
while(p != NULL)
{
printf("%d ",p->val);
p = p->next;
}
}