• java单链表反转 详细讲述


    reverse1 遍历法:在链表遍历的过程中将指针顺序置换

    public static Node reverse1(Node head) {
    		Node x = null;
    		Node temp = null;
    		while (head != null) {
    			temp = head.next;
    			head.next = x;
    			x = head;
    			head = temp;
    		}
    		return x;
    	}
    
    
    		// reverse1 遍历法打印
    	Node temp = reverse1(list.head);
    	System.out.print("遍历法:");
    	while (temp.next != null) {
    		System.out.print(temp.data+" ");
    		temp = temp.next;
    	}
    

    提示:
    在这里插入图片描述
    依旧是1->2->3->4
    准备两个空结点 pre用来保存先前结点、next用来做临时变量
    在头结点node遍历的时候此时为1结点
    next = 1结点.next(2结点)
    1结点.next=pre(null)
    pre = 1结点
    node = 2结点
    进行下一次循环node=2结点
    next = 2结点.next(3结点)
    2结点.next=pre(1结点)=>即完成2->1
    pre = 2结点
    node = 3结点
    进行循环…

    代码提示1
    temp = head.next;
    ...
    ...
    head = temp;
    -->>这两行代码是将指针移动,每循环一次,head=head.next。

    代码提示2 head.next = x; -->>head.next变为x,在循环第一次后可明显看出将箭头反转
    x = head; ->>将head赋予x,下一循环head.next=x可将下一个结点指向此结点。

    reverse2递归法:从最后一个Node开始,将指针顺序置换

    public static Node reverse2(Node head) {
    
    		if (null == head || null == head.next)
    			
    			return head;
    		Node newHead = reverse2(head.next);
    		head.next.next = head;
    		head.next = null;
    		return newHead;
    	}
    
    
    
    	// reverse2 递归法打印
    	Node temp = reverse2(list.head);
    	System.out.print("递归法:");
    	while (temp.next != null) {
    		System.out.print(temp.data+" ");
    		temp = temp.next;	
    	}
    

    提示:
    总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。
    在这里插入图片描述

    递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场。
    我们来看是怎样的一个递归过程:1->2->3->4
    程序到达Node newHead = reverse(head.next);时进入递归
    我们假设此时递归到了3结点,此时head=3结点,temp=3结点.next(实际上是4结点)
    执行Node newHead = reverse(head.next);传入的head.next是4结点,返回的newHead是4结点。
    接下来就是弹栈过程了
    程序继续执行 temp.next = head就相当于4->3
    head.next = null 即把3结点指向4结点的指针断掉。
    返回新链表的头结点newHead

    以上两种方法在https://blog.csdn.net/weixin_40807247/article/details/91435275大佬文章内均可看到哦

    reverse3,头插法

    public void print() {
    		Node p = head.next;
    		while (p != null) {
    
    			System.out.print(p.data + " ");
    			p = p.next;
    		}
    		System.out.println();
    	}
    public boolean addhead(int x) {
    		Node xnode = new Node(x, null);
    		xnode.next = head.next;
    		head.next = xnode;
    		length++;
    		return true;
    	}
    public static linklist reverse3(Node head) {
    		Node p = head.next;
    		linklist list2 = new linklist();
    		while (p != null) {
    			
    			list2.addhead(p.data);
    			p = p.next;
    		}
    		System.out.println();
    		return list2;
    	}
    
    //reserve4 头插法打印
    linklist list2 = reverse3(list.head);
    System.out.println("头插法:");
    list2.print();
    

    提示:

    此方法即为新建一个链表,将旧链表的data添加到新链表中。

  • 相关阅读:
    C# 提取方法重构
    防抖和节流
    利用Object.keys快速循环对象
    MVVM深入理解---小白速会
    异步组件使用详解
    动态组件使用详解
    Vue.$nextTick详解
    深入理解vue .sync修饰符
    vue计算属性---快速上手
    grid-layout 网格布局--快速上手
  • 原文地址:https://www.cnblogs.com/nmydt/p/13835781.html
Copyright © 2020-2023  润新知