链表翻转

要求用尽可能快的方式实现链表的翻转操作。

这个我们需要用两个指针,一个指向当前的节点,一个指向当前节点的前一个节点,每一次使当前节点的指向前一个节点来实现两个节点之间的翻转,然后顺次再移动实现循环。

代码也很简单,如下所示:

#include <iostream>
using namespace std;

struct Node
{
	int key;
	Node* next;
};
Node* createList(int arr[],int nLength);
Node* reverseList(Node* head);
void printList(Node* head);
void clearList(Node* head);

void main()
{
	int arr[] = {1,3,5,7,9};
	int nLength = sizeof(arr)/sizeof(arr[0]);
	Node* head = createList(arr,nLength);
	printList(head);
	head = reverseList(head);
	printList(head);
	clearList(head);
}

Node* createList(int arr[],int nLength)
{
	Node* head = new Node;
	head->key = arr[0];
	head->next = NULL;
	Node *p = head;
	for(int i=1;i<nLength;i++)
	{
		Node* ptr = new Node;
		ptr->key = arr[i];
		ptr->next = NULL;
		p->next = ptr;
		p = p->next;
	}
	return head;
}

Node* reverseList(Node* head)
{
	Node* preNode = NULL;
	Node* pNode = head;
	while( pNode != NULL )
	{
		Node* pNext = pNode->next;
		pNode->next = preNode;
		preNode = pNode;
		pNode = pNext;

	}
	return preNode;
}

void printList(Node* head)
{
	Node* p = head;
	while( p!= NULL )
	{
		cout<<p->key<<endl;
		p=p->next;
	}
}

void clearList(Node* head)
{
	Node* p = head;
	Node* ptr;
	while( p!= NULL )
	{
		ptr = p->next;
		delete p;
		p = ptr;
	}
}
时间: 2024-12-23 13:31:01

链表翻转的相关文章

c语言链表翻转

明天多益网络一面,晚上写了个简单的链表翻转程序找找感觉,两种思路实现.一种通过头插法实现翻转,另一种则是通过更改节点指针指向来实现.虽然简单,但动动手,活跃下思维!希望明天面试顺利! #include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; struct Node *next;}Node; Node *CreateLinkList();void PrintLinkList(Node *h);void Tr

20140428 宏定义 单链表翻转 野指针

1.宏定义swap,加括号有什么意义 #define swap(x,y) x = (x)+(y):y=(x)-(y):x=(x)-(y) 加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况: #define COM(A,B) (A)*(B) 那么COM(6+5,3),它会换成这样: (6+5)*(3) 但是如是去掉了定义中括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3),它就会换成这样:6+5*3

将单链表翻转的两种方法

将一个单链表翻转的描述很简单,例如: 输入: NODE1->NODE2->NODE3->NODE4->NODE5->NULL 输出: NODE5->NODE4->NODE3->NODE2->NODE1->NULL 那么,定义单链表如下: (为简单起见,将data字段定义为int, 当然实际应用中data很可能是一个复杂的结构体) typedef struct list_s { int data; struct list_s *next; } li

Java实现单链表翻转

单链表翻转比如有如下链表: 需要按照C B A 输出,我们可以有好几种方法: package org.andy.test; import java.util.ArrayList; import java.util.List; /** * @author andy * @version:2015-2-4 上午9:41:12 * * */ public class LinkedReverse { /** * @param args */ public static void main(String[

数据结构69:链表逆置,链表反转,链表翻转

链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点.如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点. 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法. 方法一 实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点. 唯一比较特殊的是,链表中的首元结点(第一个结点)前面没有结点,所以在改变其指针指向的时候,要将其

链表翻转的图文讲解(递归与迭代两种实现)

链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种.最近在复习的时候,发现网上的资料都只告诉了怎么做,但是根本没有好好介绍两种方法的实现过程与原理.所以我觉得有必要好好的整理一篇博文,来帮忙大家一步步理解其中的实现细节.  我们知道迭代是从前往后依次处理,直到循环到链尾:而递归恰恰相反,首先一直迭代到链尾也就是递归基判断的准则,然后再逐层返回处理到开头.总结来说,链表翻转操作的顺序对于迭代来说是从链头往链尾,而对于递归是从链尾往链头.下面我会用详细的图文来剖析其中实

链表翻转系列

Problem I 翻转链表 程序(简洁版) 非递归 ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while (cur != null ) { ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } Problem II: Swap Nodes in Pairs Given a

华为机试—链表翻转(给出链表和数K)

题目: 给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6 基本思想: 链表中长度为k的一段从链表中摘除,翻转之后在将其衔接回链表. #include<iostream> using namespace std; typedef struct LNode { int m_nValue; struct LNode* m_pNext; }LNode; LNode* rever

单链表翻转

方法一:通过三个指针来分别指向链表的当前节点.上一节点.下一节点 分别为P1,P2,P3. 上代码: static class Node{ int val; Node next; } public static Node reverse(Node node){ if (node==null||node.next==null){ return null; } Node current,pnext,prev; current=node.next; pnext=current.next; curren