链表逆序 代码(C)
本文地址: http://blog.csdn.net/caroline_wendy
链表逆序, 作为链表操作的基础必须要熟练手写.
主要包含3个部分, 一个指针记录后面节点, 一个指针记录前面节点, 把当前节点指到前面节点, 移动到后面节点, 前后指针依次移动.
非递归链表逆序算法的核心代码只有10行.
代码:
/*
* main.cpp
*
* Created on: 2014.9.12
* Author: Spike
*/
/*eclipse cdt, gcc 4.8.1*/
#include <stdio.h>
#include <stdlib.h>
struct ListNode{
int data;
ListNode* next;
};
void PrintList(ListNode* head);
ListNode* ReverseList(ListNode* head);
int main()
{
ListNode* head = new ListNode();
ListNode* node1 = new ListNode();
ListNode* node2 = new ListNode();
ListNode* node3 = new ListNode();
ListNode* node4 = new ListNode();
head->data = 0;
head->next = node1;
node1->data = 1;
node1->next = node2;
node2->data = 2;
node2->next = node3;
node3->data = 3;
node3->next = node4;
node4->data = 4;
node4->next = NULL;
PrintList(head);
ListNode* re = ReverseList(head);
PrintList(re);
return 0;
}
ListNode* ReverseList(ListNode* head)
{
if(head == NULL || head->next == NULL) {
return head; /*链表为空或只有一个元素则直接返回*/
}
ListNode* prev = NULL;
ListNode* next = NULL;
while (head != NULL) {
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
void PrintList(ListNode* head)
{
while(head != NULL)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
输出:
0 1 2 3 4
4 3 2 1 0