【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转

本文来分享关于链表的五种经典操作的实现:

  1. 单链表反转
  2. 链表中环的检测
  3. 两个有序的链表合并
  4. 删除链表倒数第n个结点
  5. 求链表的中间结点

单链表反转实现

package com.anomalous.array;

/**
 * 关于链表的操作
 * 1) 单链表反转
 * @author 天赋吉运-杨晓慧
 * @create 2019-04-27 16:40
 */
public class LinkedListAlgo {

    public static class Node {
        private int data;
        private Node next;

        public Node(int data, Node next) {
            this.data = data;
            this.next = next;
        }

        public int getData() {
            return data;
        }
    }


    public static void main(String[] args) {
        // 初始化单链表
        Node node5=new Node(5,null);
        Node node4=new Node(4,node5);
        Node node3=new Node(3,node4);
        Node node2=new Node(2,node3);
        Node node1=new Node(1,node2);
        // 调用反转单链表方法
        Node reverse = reverse(node1);
        System.out.println(reverse);
    }	
	
	
    /**
     * 单链表反转
     * @param list 传入单链表
     * @return 返回反转之后的单链表
     */
    public static Node reverse(Node list) {
        Node curr = list,
        pre = null;   // 定义转换后的新链表, 初始为为null
        while (curr != null) {
        // 1.保存当前节点的next指针指向的链表
            Node next = curr.next;    
        // 2. 把当前节点的next指针指向反转后的新链表
            curr.next = pre;
         // 3. 保存当前的链表状态放入到新链表中
            pre = curr;
          // 4.将当前节点指针后移一位,准备下一次循环
            curr = next;
        }
        return pre;
    }

}

下面走断点看一下每次循环之后的结果:

初始状态
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第1张图片
第一次循环结束
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第2张图片
第二次循环结束
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第3张图片
第三次循环结束
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第4张图片
第四次循环结束
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第5张图片
第五次循环结束
【数据结构与算法】-- 6.1 链表的5个经典操作--单链表反转_第6张图片
数据结构和算法的很多东西有时候自己一个人生想也想不出个所以然来,很多最优解法的思路都特别的巧妙,建议大家不要掉在细节里思考太久,可以先用自己想到的最直接最暴力的方法先试试,另外再做优化,一个小时左右没什么思路就自己去网上查查别人的思路,一般别人给的思路总是能让自己惊叹和恍然大悟,等看明白了别人的思路再自己手写一遍去对比和体会,以后遇到这类问题的时候思路也会更开阔。 但要注意,及时总结和回顾很重要。

你可能感兴趣的:(算法总结,数据结构与算法)