美文网首页
将单链表的每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个节点之间逆序

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