单链表每隔k反转

初步版本,没有考虑特殊情况。

import java.util.*;

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

class Link{
 Node head = null;
 Node tmp = null;
 
 public void addnode(int data) {
  Node n = new Node(data);
  if(head == null) {
   head = n;
   tmp = head;
   return;
   }
  tmp.next = n;
  while(tmp.next != null)//确保tmp在链尾
   tmp = tmp.next;
 }
 
 public Link reverselink(Link a) {//反转:迭代,从表头开始一个个加到另一个表中。
  Link b = new Link();
 while(a.tmp!=null) {
  a.tmp = a.head.next;
  a.head.next = b.head;
  b.head = a.head;
  a.head = a.tmp;
 }
  return b;
 }
 
 public Link addlink(Link a, Link b) {//把b加到a后面:先找到a的尾巴,再连起来。
  a.tmp = a.head;
  while(a.tmp.next != null) {
   a.tmp = a.tmp.next;
  }
  a.tmp.next = b.head;
  return a;
 }
 
 public Link reverselink(Link a,int num, int k) {//每隔k反转:把a分割,一段一段反转,剩余补在最后。
    Link c = new Link();
  a.tmp = a.head;
       for(int i = num-k; i >= 0; i-=k) {
   Link b = new Link();
   for(int count = k; count > 0; count--) {
       b.addnode(a.tmp.data);
       a.tmp = a.tmp.next;    
      }
   if(c.head == null)
   {c = reverselink(b);
   }
   else
   {c.addlink(c,reverselink(b));
   }
 }
     if(a.tmp != null) {
      a.head = a.tmp;
     c.addlink(c,a);
     }
  return c;
 }
 
 public void printLink(Link a) {//输出
  a.tmp = a.head;
  if(a.tmp == null)
  {System.out.println("null");}
  else{
   while(a.tmp.next != null) {
   System.out.print(a.tmp.data +" ");
   a.tmp = a.tmp.next;
      }
   System.out.print(a.tmp.data);
  }
 }
 
}
 
 
public class Main {
 
 public static void main(String[] args) {
  Scanner in = new Scanner (System.in);
  int num = in.nextInt();
  int k = in.nextInt();
  Link L =new Link();
  for(int i=0; i<num; i++) {
   L.addnode(in.nextInt());
  }
  L.printLink(L.reverselink(L,num,k));  
  in.close();
 }

}

原文地址:https://www.cnblogs.com/dyq19/p/10263788.html