输入k 实现链表每k项都逆序输出
2014-09-27 11:25
429 查看
如:1,2,3,4,5 输入2 结果为 2,1,4,3,5
条件:单链表
思路:先将要逆序的元素从原链表中去掉,放在某一个数据结构中,再按照逆序插入原链表。单链表必须要考虑的是某个节点的父节点该如何找到,当然得考虑到右重复值得情况,对于,头节点来说,是没有父节点的,所以,每次插入都是在链表的头节点的前面插入。我是从头部开始去掉的,那么这第一个去掉的元素(elem)再插入链表应该是最先插入,即先进先出。当第一次逆序结束后,第二次再去掉后面的某些部分,考虑到找插入点的父节点的麻烦,所以我选择的是从某个元素(A)的的后面插入,而这里的A我可以从头次插入得到,即最先从队列中出来的那个元素(elem),删除的元素也是从elem开始往后删,要逆序输出,得先进来的元素后出去,即栈的性质
程序用到:队列(在第一次逆序时,用队列的先进先出性质),栈(在其它逆序输出时,用到栈的先进后出)
import java.util.Scanner;
public class ListReverse{
public boolean isEmpty(){
return head==null;
}
public void insert(MyElem myElem){
if (isEmpty()) {
head=myElem;
}else{
tail.next=myElem;
}
tail=myElem;
}
public void insertHead(MyElem myElem){
if (isEmpty()) {
head=myElem;
tail=myElem;
tail.next=null;
return;
}
myElem.next=head;
head=myElem;
}
public void insertAfterPosition(MyElem pos,MyElem newElem){
if (pos.next==null) {
pos.next=newElem;
newElem.next=null;
tail=newElem;
return;
}
MyElem temp=pos.next;
pos.next=newElem;
newElem.next=temp;
}
public MyElem removeAfterPosition(MyElem pos){
if (pos.next==null) {
throw new Error("wrong,no next");
}
MyElem temp=pos.next;
if (pos.next.next==null) {
pos.next=null;
}else{
pos.next=temp.next;
}
return temp;
}
public MyElem removeHead(){
if(isEmpty()){
return null;
}
MyElem temp=head;
head=head.next;
return temp;
}
public void printMyList(){
MyElem temp=head;
while(temp!=null){
System.out.print(temp.elem+" ");
temp=temp.next;
}
System.out.println();
}
public int getLengthOfMyList(){
int count=0;
MyElem temp=head;
while(temp!=null){
count++;
temp=temp.next;
}
return count;
}
public void reverse(int k){
int len=getLengthOfMyList();
if(k>len|| k<=1){
return;
}
int count=1;
MyElem firstDotPre=null;//in next recyle ,this will be the first elemt.pre;
MyQueue mq=new MyQueue();
MyStack ms=new MyStack(k);
while(len/(k*count)!=0){
if (count==1) {
//首次从头部逆序
//删
for (int i=0;i<k ;i++ ) {
mq.enQueue(removeHead());
}
//存
for (int i=0;i<k ;i++ ) {
insertHead(mq.deQueue());
if (i==0) {
firstDotPre=head;
}
}
}else{
//其它地方逆序
//删
for(int i=0;i<k;i++){
ms.push(removeAfterPosition(firstDotPre));
}
//here wll print more elem than it should be ,but it will not be a promblem
// mq.printMyQueue();
//存
MyElem temp=null;
for (int i=0;i<k ; i++) {
temp=ms.pop();
insertAfterPosition(firstDotPre,temp);
firstDotPre=temp;
}
}
count++;
}
}
public static void main(String[] args){
ListReverse lr=new ListReverse();
for (int i=0;i<5 ;i++ ) {
lr.insert(new MyElem(i,null));
}
lr.printMyList();
// lr.removeAfterPosition(lr.head);
// lr.insertInPosition(lr.tail,new MyElem(10,null));
Scanner scan=new Scanner(System.in);
int k=scan.nextInt();
lr.reverse(k);
lr.printMyList();
}
MyElem head=null;
MyElem tail=null;
}
//单个节点元素
class MyElem{
int elem;
MyElem next;
public MyElem(MyElem next){
this.next=next;
}
public MyElem(int elem , MyElem next){
this.elem=elem;
this.next=next;
}
}
//队列
class MyQueue{
MyElem head=null;
MyElem tail=null;
public boolean isEmpty(){
return head==null;
}
public void enQueue(MyElem myElem){
if(isEmpty()){
head=myElem;
}else{
tail.next=myElem;
}
tail=myElem;
}
public MyElem deQueue(){
if (isEmpty()) {
throw new Error("no element");
}
MyElem temp=head;
head=head.next;
return temp;
}
public void printMyQueue(){
MyElem temp=head;
while(temp!=null){
System.out.print(temp.elem+" ");
temp=temp.next;
}
System.out.println();
}
}
//栈
class MyStack{
MyElem[] elems=null;
public MyStack(int k){
elems=new MyElem[k];
}
int topOfStack=-1;
public boolean isEmpty(){
return topOfStack==-1;
}
public boolean isFull(){
return topOfStack==10;
}
public void push(MyElem elem){
topOfStack++;
if(!isFull()){
elems[topOfStack]=elem;
}
}
public MyElem pop(){
if (!isEmpty()) {
MyElem temp=elems[topOfStack];
topOfStack--;
return temp;
}else{
throw new Error("wrong ,no elem in stack ");
}
}
}
条件:单链表
思路:先将要逆序的元素从原链表中去掉,放在某一个数据结构中,再按照逆序插入原链表。单链表必须要考虑的是某个节点的父节点该如何找到,当然得考虑到右重复值得情况,对于,头节点来说,是没有父节点的,所以,每次插入都是在链表的头节点的前面插入。我是从头部开始去掉的,那么这第一个去掉的元素(elem)再插入链表应该是最先插入,即先进先出。当第一次逆序结束后,第二次再去掉后面的某些部分,考虑到找插入点的父节点的麻烦,所以我选择的是从某个元素(A)的的后面插入,而这里的A我可以从头次插入得到,即最先从队列中出来的那个元素(elem),删除的元素也是从elem开始往后删,要逆序输出,得先进来的元素后出去,即栈的性质
程序用到:队列(在第一次逆序时,用队列的先进先出性质),栈(在其它逆序输出时,用到栈的先进后出)
import java.util.Scanner;
public class ListReverse{
public boolean isEmpty(){
return head==null;
}
public void insert(MyElem myElem){
if (isEmpty()) {
head=myElem;
}else{
tail.next=myElem;
}
tail=myElem;
}
public void insertHead(MyElem myElem){
if (isEmpty()) {
head=myElem;
tail=myElem;
tail.next=null;
return;
}
myElem.next=head;
head=myElem;
}
public void insertAfterPosition(MyElem pos,MyElem newElem){
if (pos.next==null) {
pos.next=newElem;
newElem.next=null;
tail=newElem;
return;
}
MyElem temp=pos.next;
pos.next=newElem;
newElem.next=temp;
}
public MyElem removeAfterPosition(MyElem pos){
if (pos.next==null) {
throw new Error("wrong,no next");
}
MyElem temp=pos.next;
if (pos.next.next==null) {
pos.next=null;
}else{
pos.next=temp.next;
}
return temp;
}
public MyElem removeHead(){
if(isEmpty()){
return null;
}
MyElem temp=head;
head=head.next;
return temp;
}
public void printMyList(){
MyElem temp=head;
while(temp!=null){
System.out.print(temp.elem+" ");
temp=temp.next;
}
System.out.println();
}
public int getLengthOfMyList(){
int count=0;
MyElem temp=head;
while(temp!=null){
count++;
temp=temp.next;
}
return count;
}
public void reverse(int k){
int len=getLengthOfMyList();
if(k>len|| k<=1){
return;
}
int count=1;
MyElem firstDotPre=null;//in next recyle ,this will be the first elemt.pre;
MyQueue mq=new MyQueue();
MyStack ms=new MyStack(k);
while(len/(k*count)!=0){
if (count==1) {
//首次从头部逆序
//删
for (int i=0;i<k ;i++ ) {
mq.enQueue(removeHead());
}
//存
for (int i=0;i<k ;i++ ) {
insertHead(mq.deQueue());
if (i==0) {
firstDotPre=head;
}
}
}else{
//其它地方逆序
//删
for(int i=0;i<k;i++){
ms.push(removeAfterPosition(firstDotPre));
}
//here wll print more elem than it should be ,but it will not be a promblem
// mq.printMyQueue();
//存
MyElem temp=null;
for (int i=0;i<k ; i++) {
temp=ms.pop();
insertAfterPosition(firstDotPre,temp);
firstDotPre=temp;
}
}
count++;
}
}
public static void main(String[] args){
ListReverse lr=new ListReverse();
for (int i=0;i<5 ;i++ ) {
lr.insert(new MyElem(i,null));
}
lr.printMyList();
// lr.removeAfterPosition(lr.head);
// lr.insertInPosition(lr.tail,new MyElem(10,null));
Scanner scan=new Scanner(System.in);
int k=scan.nextInt();
lr.reverse(k);
lr.printMyList();
}
MyElem head=null;
MyElem tail=null;
}
//单个节点元素
class MyElem{
int elem;
MyElem next;
public MyElem(MyElem next){
this.next=next;
}
public MyElem(int elem , MyElem next){
this.elem=elem;
this.next=next;
}
}
//队列
class MyQueue{
MyElem head=null;
MyElem tail=null;
public boolean isEmpty(){
return head==null;
}
public void enQueue(MyElem myElem){
if(isEmpty()){
head=myElem;
}else{
tail.next=myElem;
}
tail=myElem;
}
public MyElem deQueue(){
if (isEmpty()) {
throw new Error("no element");
}
MyElem temp=head;
head=head.next;
return temp;
}
public void printMyQueue(){
MyElem temp=head;
while(temp!=null){
System.out.print(temp.elem+" ");
temp=temp.next;
}
System.out.println();
}
}
//栈
class MyStack{
MyElem[] elems=null;
public MyStack(int k){
elems=new MyElem[k];
}
int topOfStack=-1;
public boolean isEmpty(){
return topOfStack==-1;
}
public boolean isFull(){
return topOfStack==10;
}
public void push(MyElem elem){
topOfStack++;
if(!isFull()){
elems[topOfStack]=elem;
}
}
public MyElem pop(){
if (!isEmpty()) {
MyElem temp=elems[topOfStack];
topOfStack--;
return temp;
}else{
throw new Error("wrong ,no elem in stack ");
}
}
}
相关文章推荐
- 输入k 实现链表每k项都逆序输出
- 实现链表的逆序输出和删除某节点
- 输入链表输出该链表倒数第k个结点java实现
- 《任意输入一个合理大小的字符串,实现逆序输出并统计一个字符串中字母、数字、空格及其他字符的个数》
- java实现输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- 用js实现输入一个链表,输出该链表中倒数第k个结点。
- 用栈实现逆序输出键盘输入
- java实现输入一个链表,反转链表后,输出链表的所有元素。
- C语言实现单链表逆序与逆序输出实例
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 单链表逆序输出的几种实现方式
- C语言数据结构实现链表逆序并输出
- java实现输入一个链表,输出该链表中倒数第k个结点。
- 用栈实现逆序输出键盘输入
- C语言:用递归实现将输入的整数按逆序输出。如输入12345,则输出54321。
- 用递归实现输入一系列整数后逆序输出
- 用单链表来实现逆序输出
- 题目: 从键盘输入若干个正整数, 按从小到大的顺序输出. 输入负数表示输入结束. 用链表实现.
- 利用指针实现将5个整数输入到数组a中,然后将a逆序复制到数组b中,并输出b中各单元的值。
- C语言实现单链表逆序与逆序输出实例