单链表翻转

方法一:通过三个指针来分别指向链表的当前节点、上一节点、下一节点

    分别为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;
        current.next=null;
        while (pnext!=null){
            prev=pnext.next;
            pnext.next=current;
            current=pnext;
            pnext=prev;
        }
        node.next=current;
        return node;
    }

方法二:

static Node reverse2(Node node){
        if (node==null||node.next==null){
            return null;
        }
        Node current,pnext;
        current=node.next;
        while (current.next!=null){
            pnext=current.next;
            current.next=pnext.next;
            pnext.next=node.next;
            node.next=pnext;
        }
        return node;
    }
时间: 2024-08-04 02:38:19

单链表翻转的相关文章

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[

单链表翻转的几种写法

/* * 带头节点 */ ListNode * reverse(ListNode *head) { if (head == NULL || head->next == NULL) return head; ListNode nhead(-1);//头节点 nhead.next = head; ListNode *prev = head; ListNode *next = head->next; while (next != NULL) { prev->next = next->ne

C,单链表翻转函数

struct ST_StackNode{int num; datatype data; struct ST_StackNode *pNext; //指针域};typedef struct ST_StackNode StackNode; StackNode reverse(StackNode phead){if (phead == NULL){ return NULL; }if (phead->pNext == NULL) { return phead; } StackNode* pre, *cu

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

C实现之单链表逆置问题

/*问题描述,如何在时间复杂度为O(n)的前提下,实现单链表翻转.并尽量减少内存消耗. 即1-2-4-5-6转化为6-5-4-2-1. */ 1 # include<stdio.h> 4 struct Slist{ 5 6 int size; 7 struct sl* head; 8 9 10 }; 11 struct sl{ 12 13 int k; 14 struct sl* next; 15 16 17 }; 18 typedef struct Slist Sl; 19 typedef

让我们来写个算法吧,(1)翻转单链表

作为面试中最最最常考的链表题之一,翻转单链表.有以下两种解法: 例: 输入 1->2->3->4  输出 4->3->2->1 Node类定义如下 class Node { int value; Node next; public Node(int value, Node next) { this.value = value; this.next = next; } 1.遍历法 此方法根据链表遍历,通过拆分,刷新节点来达到翻转单链表的功能. 草稿过程 第一次遍历 主链表

Java基础之翻转单链表

/** * @author luochengcheng * 定义一个单链表 */ class Node { //变量 private int record; //指向下一个对象 private Node nextNode; public Node(int record) { super(); this.record = record; } public int getRecord() { return record; } public void setRecord(int record) { t