美文网首页
将单链表的每k个节点之间逆序

将单链表的每k个节点之间逆序

作者: 王古 | 来源:发表于2018-09-30 16:12 被阅读0次

给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆 该过序,如果最后不够K个节点一组,则不调整最后几个节点。例如:

链表: 1>2>3>4>5>6>7>8>null K=3。

调整后为: 3-2-1-6-5-4-7-8>null 其中7, 8不调整,因为不够一组。

import java.util.Stack;

public class Problem_12_ConvertEveryKNodesInList {

    public static class Node {
        public int value;
        public Node next;

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

    public static Node reverseKNodes1(Node head, int K) { //利用栈结构
        if (K < 2) {
            return head;
        }
        Stack<Node> stack = new Stack<Node>();
        Node newHead = head;
        Node cur = head;
        Node pre = null;
        Node next = null;
        while (cur != null) {
            next = cur.next;
            stack.push(cur);
            if (stack.size() == K) {
                pre = resign1(stack, pre, next);
                newHead = newHead == head ? cur : newHead;
            }
            cur = next;
        }
        return newHead;
    }

    public static Node resign1(Stack<Node> stack, Node left, Node right) {
        Node cur = stack.pop();
        if (left != null) {
            left.next = cur;
        }
        Node next = null;
        while (!stack.isEmpty()) {
            next = stack.pop();
            cur.next = next;
            cur = next;
        }
        cur.next = right;
        return cur;
    }

    public static Node reverseKNodes2(Node head, int K) {  //直接在原链表修改
        if (K < 2) {
            return head;
        }
        Node cur = head;
        Node start = null;
        Node pre = null;
        Node next = null;
        int count = 1;
        while (cur != null) {
            next = cur.next;
            if (count == K) {
                start = pre == null ? head : pre.next;
                head = pre == null ? cur : head;
                resign2(pre, start, cur, next);
                pre = start;
                count = 0;
            }
            count++;
            cur = next;
        }
        return head;
    }

    public static void resign2(Node left, Node start, Node end, Node right) {
        Node pre = start;
        Node cur = start.next;
        Node next = null;
        while (cur != right) {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        if (left != null) {
            left.next = end;
        }
        start.next = right;
    }

    public static void printLinkedList(Node head) {
        System.out.print("Linked List: ");
        while (head != null) {
            System.out.print(head.value + " ");
            head = head.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = null;
        int K = 3;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

        head = new Node(1);
        K = 3;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

        head = new Node(1);
        head.next = new Node(2);
        K = 2;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

        head = new Node(1);
        head.next = new Node(2);
        K = 3;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

        head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);
        K = 2;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

        head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);
        head.next.next.next.next = new Node(5);
        head.next.next.next.next.next = new Node(6);
        head.next.next.next.next.next.next = new Node(7);
        head.next.next.next.next.next.next.next = new Node(8);
        K = 3;
        printLinkedList(head);
        head = reverseKNodes1(head, K);
        printLinkedList(head);
        head = reverseKNodes2(head, K);
        printLinkedList(head);
        System.out.println("=======================");

    }

运行结果:


image.png

相关文章

  • 将单链表的每k个节点之间逆序

    给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆 该过序,如果最后不够K个节点一组,...

  • 5_7链表的k逆序

    有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如链表1-...

  • 单链表逆序操作学习

    前言 将单链表逆序,方法有三种: 遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组,并重新构造一个链表 ...

  • 算法-链表每k位逆序

    链表的每K位逆序,其实主要的思路就是三个步骤:1.找到k个节点的开始节点和结束节点,还有当前这k个节点的最后一个节...

  • 单链表逆序非递归实现和递归实现

    “单链表逆序”问题。要求不能使用额外的节点存储空间,如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表向右旋转k个位置

    问题描述: 将单链表向右旋转k个位置 思路:1. 找到链表倒数第k+1个节点和尾节点; 2. 原链表的尾节点指向首...

  • 2.单链表

    该部分包含以下内容-单链表的增删改查-计算链表长度-逆序链表-寻找(删除)链表倒数第K个元素-逆序打印链表(使用栈)

  • Leetcode系列之链表(11)

    题目: 将给出的链表中的节点每k个一组翻转,返回翻转后的链表 如果链表中的节点数不是k的倍数,将最后剩下的节点保持...

  • Leetcode-Medium-2 Add Two Number

    题目 思路 给定两哥数字非负的单链表,每条单链表逆序存储着一个数字。将两条单链表存储的数字相加,并逆序放入单链表中...

网友评论

      本文标题:将单链表的每k个节点之间逆序

      本文链接:https://www.haomeiwen.com/subject/twpwoftx.html