您的位置:首页 > 编程语言 > Java开发

翻转单链表中的K个节点——By Java

2013-06-24 22:44 176 查看
public class LinkListReverseK {

/**
* 题目要求:给定一个单链表和一个参数K,要求翻转K个节点,且翻转后剩余的节点数大于K则继续翻转,否则停止;
* 例如:链表:1,2,3,4,5,6,7,8,9,10;K=4;则应有结果:8,7,6,5,4,3,2,1,9,10;
* 思路:在传统的链表翻转的基础上,计算出一共需要翻转的节点数目,每次循环只改变一个节点的指向直至计数器为0;
* @param args
* @author Adai
* @since 2013/06/24
*/
private static class LinkNode{
private int data;
private LinkNode next;
/**
* @return the data
*/
public LinkNode(){

}
public LinkNode(int d){
this.data=d;
this.next=null;
}
public int getData() {
return data;
}
/**
* @param data the data to set
*/
public void setData(int data) {
this.data = data;
}
/**
* @return the next
*/
public LinkNode getNext() {
return next;
}
/**
* @param next the next to set
*/
public void setNext(LinkNode next) {
this.next = next;
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={1,2,3,4,5,6,7,8,9,10};
LinkListReverseK llrk=new LinkListReverseK();
LinkNode h=llrk.Init(a);
LinkNode r=llrk.LinkReverse(h,4);
while(r!=null){
System.out.println(r.getData());
r=r.next;
}
}
private LinkNode Init(int[] a){
LinkNode head=null;
LinkNode last=null;
for(int i=0;i<a.length;i++){
LinkNode one=new LinkNode(a[i]);
if(last!=null){
last.next=one;
last=one;
}
if(i==0){
head=one;
last=one;
}
}
return head;
}
private LinkNode LinkReverse(LinkNode head,int k){
if(head==null) return null;
if(k<1) return head;
LinkNode run=head;
int count=0;
while(run!=null){
count++;
run=run.next;
}
if(count<k){
return head;
}
int times=count/k;
times=times*k;
System.out.println("times="+times);
LinkNode p=head;
LinkNode q=null;
LinkNode r=null;
while(times>0){
System.out.println("dd:"+p.getData()+":"+times);
q=p.next;
p.next=r;
r=p;
p=q;
times--;
}
head.next=q;
return r;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐