反转链表-C语言实现

题目要求:在O(n)的时间内反转链表,并返回反转后链表的头指针。

分析:求解链表问题首先一定要考虑非空问题,而且要注意终止的位置。

如图所示,反转的时候定义三个节点,pCur代表当前节点、pNext代表指向的下一个节点、pPre代表前一个节点。有了这三个节点就可以从前往后遍历,而且保证链表不会断裂!

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int value;
	ListNode* next;
};

ListNode* reverseList(ListNode* head)
{
	ListNode* pCur=head;
	ListNode* rHead=NULL;
	ListNode* pPre=NULL;
	while(pCur!=NULL)
	{
		ListNode* pNext=pCur->next;
		if(pNext==NULL)
			rHead=pCur;
		pCur->next=pPre;
		pPre=pCur;
		pCur=pNext;
	}
	return rHead;
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		ListNode* head=(ListNode *)malloc(sizeof(ListNode));
		ListNode* p=head;
		p->next=NULL;
		for(int i=0;i<n;i++)
		{
			ListNode* q=(ListNode*)malloc(sizeof(ListNode));
			int tmp;
			scanf("%d",&tmp);
			q->value=tmp;
			p->next=q;
			p=q;
			p->next=NULL;
		}
		ListNode *pHead=reverseList(head->next);
		while(pHead)
		{
			printf("%d ",pHead->value);
			pHead=pHead->next;
		}
	}
	return 0;
}
时间: 2024-08-07 06:14:29

反转链表-C语言实现的相关文章

Leetcode 206题 反转链表(Reverse Linked List)Java语言求解

题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 迭代解法 /** Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } */ class Solution { public ListNode

C语言实现反转链表 II(指定2个节点反转)

要求: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL 方法迭代链接反转 算法 在看具体算法之前,有必要先弄清楚链接反转的原理以及需要哪些指针.举例而言,有一个三个不同结点组成的链表 A → B → C,需要反转结点中的链接成为 A ← B ← C. 假设我们有两个指

算法-leetcode-206.反转链表

题目链接:反转链表 主要是弄清楚几个变量该怎么交换值即可: c语言版本: /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head){ //可以在开始的时候处理下空链表和只有一个元素的情况,直接返回就行,循环也能处理这两种情况,所以就省掉了对应的

剑指Offer对答如流系列 - 反转链表

面试题24:反转链表 题目描述 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点 链表结构 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 问题分析 头插法是反转链表非常经典的一种手段,这里演示一下吧,毕竟这个在JDK源码中也能遇见. 核心代码如下: ListNode Inverse(ListNode L) { ListNode p,

【C/C++】反转链表

/* * reverseList.c * * Created on: 2014年6月25日 * Author: wenbo */ #include <iostream> using namespace std; struct Node { Node* next; int data; }; void trace(Node* node) { Node* tmp = node; while (tmp != NULL) { cout << tmp->data << &qu

Leetcode:Reverse Linked List II 反转链表区间

Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given   1->2->3->4->5->NULL,  m = 2 and n = 4, return  1->4->3->2->5->NULL. Note:Given m, n satisfy the following

反转链表

节点类: public class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val; } } 反转链表: public class Solution { public ListNode ReverseList(ListNode head) { ListNode node = head: //node为当前操作节点 ListNode rhead = head; //rhead为反转后的链表头 Li

剑指offer六:反转链表

输入一个链表,反转链表后,输出链表的所有元素 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre = null; ListNode next = null; while(head != null){

九度_题目1518:反转链表

//后插法建立链表,然后从第二个元素(若有的话)开始依次插入到头结点后面从而达到反转链表的效果 题目描述: 输入一个链表,反转链表后,输出链表的所有元素. (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数. 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例, 以此输出链表反转后的元素,如没有元素则输出N