单链表每隔k反转
Posted dyq19
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表每隔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();
}
}
以上是关于单链表每隔k反转的主要内容,如果未能解决你的问题,请参考以下文章
Java算法 -- 单链表的反转单链表实现栈和队列以及双端队列K 个一组翻转链表
Java算法 -- 单链表的反转单链表实现栈和队列以及双端队列K 个一组翻转链表