算法系列之-链表反转和链表部分反转

版权声明:本文为博主原创文章,转载请注明。 https://blog.csdn.net/zhaojianyin/article/details/79089146

反转链表

package it.list;

/**
 * @项目名称:util
 * @类名称:Fanzhuan @类描述:反转链表
 * @version 1.0
 */
public class Fanzhuan {

    public static Node fanzhuanlist(Node head) {
        Node pre = null;
        Node next = null;
        while (head != null) {
            next = head.next;// 拿到下一个节点
            head.next = pre;// 将当前节点next设为上一个节点
            pre = head;// 将上一个节点设为头节点
            head = next;// 遍历下一个节点
        }
        return pre;
    }

    public static void main(String[] args) {
        Node node = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        node.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        Node test = fanzhuanlist(node);
        while (test != null) {
            System.out.println(test.value);
            test = test.next;
        }
    }
}

反转部分链表


package it.list;

/**
 * @项目名称:util
 * @类名称:FanzhuanBufen @类描述:反转部分链表,从from 到 to
 *
 * @author 赵建银
 * @date 2018年1月17日
 * @time 下午6:58:08
 * @version 1.0
 */
public class FanzhuanBufen {
    public static Node fanzhuanlist(Node head, int from, int to) {
        Node node = head;
        Node fpre = null;//from节点的前一个节点
        Node fpos = null;//to节点的下一个节点
        int len = 0;
        while (node != null) {
            len++;
            fpre = from - 1 == len ? node : fpre;
            fpos = to + 1 == len ? node : fpos;
            node = node.next;
        }
        if (from > to || from < 1 || from > len) {
            return head;
        }

        node = fpre == null ? head : fpre.next;// 反转的第一个节点
        Node node2 = node.next;// 反转的节点的下一个节点
        node.next = fpos;//将当前头节点的下一个节点连上to的下一个节点
        Node next = null;
        while (node2 != fpos) {//实现反转
            next = node2.next;
            node2.next = node;
            node = node2;
            node2 = next;
        }
        if (fpre != null) {//如果prfe不为空说明不是第一个节点之前的节点,则不头节点不变如果为空头节点变为node
            fpre.next = node;
            return head;
        }
        return node;
    }

    public static void main(String[] args) {
        Node node = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        node.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        Node test = fanzhuanlist(node, 2, 4);
        while (test != null) {
            System.out.print(test.value + "->");
            test = test.next;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zhaojianyin/article/details/79089146