数据结构与算法19-迭代器-递归

 以用户交互的形式呈现迭代器的功能,迭代器更加灵活的对链表进行增删改查。

迭代器上删除一项后,要将指针放到后一项,不能放在前一项。执行插入方法后,将current指向新插入的链结点。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Link
{
	public Link next;
	public long ddata;
	public Link(long dd)
	{
		ddata = dd;
	}
	public void displayLink()
	{
		System.out.print(ddata+" ");
	}
}
class LinkList
{
	private Link first;
	public LinkList()
	{
		first = null;
	}
	public Link getFirst()
	{
		return first;
	}
	public void setFirst(Link f)
	{
		first = f;
	}
	public boolean isEmpty()
	{
		return first == null;
	}
	public ListIterator getIterator(){
		return new ListIterator(this);
	}
	public void displayList()
	{
		Link current = first;
		while(current != null)
		{
			current.displayLink();
			current = current.next;
		}
		System.out.println(" ");
	}
}
class ListIterator
{
	private Link current;
	private Link previous;
	private LinkList ourList;
	public ListIterator(LinkList list)
	{
		ourList = list;
		reset();
	}
	public void reset()
	{
		current = ourList.getFirst();
		previous = null;
	}
	public boolean atEnd()
	{
		return (current.next==null);
	}
	public void nextLink()
	{
		previous = current;
		current = current.next;
	}
	public Link getCurrent()
	{
		return current;
	}
	public void insertAfter(long dd)
	{
		Link newLink = new Link(dd);
		if(ourList.isEmpty())
		{
			ourList.setFirst(newLink);
			current = newLink;
		}
		else
		{
			newLink.next = current.next;
			current.next = newLink;
			nextLink();
		}
	}
	public void insertBefore(long dd)
	{
		Link newLink = new Link(dd);
		if(previous == null)
		{
			newLink.next = ourList.getFirst();
			ourList.setFirst(newLink);
			reset();
		}
		else
		{
			newLink.next = previous.next;
			previous.next = newLink;
			current = newLink;
		}
	}
	public long deleteCurrent()
	{
		long value = current.ddata;
		if(previous == null)
		{
			ourList.setFirst(current.next);
			reset();
		}
		else
		{
			previous.next = current.next;
			if(atEnd())
				reset();
			else
				current = current.next;
		}
		return value;
		
	}
}
class InterItarApp
{
public static void main(String[] args) throws IOException
{
	LinkList theList = new LinkList();
	ListIterator iter1 = theList.getIterator();
	long value;
	iter1.insertAfter(20);
	iter1.insertAfter(40);
	iter1.insertAfter(80);
	iter1.insertBefore(60);
	while(true)
	{
		System.out.print("enter first letter of show,reset, ");
		System.out.print("next,get,before,after,delete:");
		System.out.flush();
		int choice = getChar();
		switch(choice)
		{
		case 's':
			if(!theList.isEmpty())
				theList.displayList();
			else
				System.out.println("list is empty");
			break;
		case 'r':
			iter1.reset();
			break;
		case 'n':
			if(!theList.isEmpty()&&!iter1.atEnd())
				iter1.nextLink();
			else
				System.out.println("can't go to next link");
			break;
		case 'g':
			if(!theList.isEmpty())
			{
				value = iter1.getCurrent().ddata;
				System.out.println("returned "+value);
			}
			else
				System.out.println("list is empty");
			break;
		case 'b':
			System.out.print("enter value to insert: ");
			System.out.flush();
			value = getInt();
			iter1.insertBefore(value);
			break;
		case 'a':
			System.out.print("enter value to insert: ");
			System.out.flush();
			value = getInt();
			iter1.insertAfter(value);
			break;
		case 'd':
			if(!theList.isEmpty())
			{
				value = iter1.deleteCurrent();
				System.out.println("deleted "+ value);
			}
			else
				System.out.println("can't delete");
			default:
				System.out.println("invalid entry");
			
		}
	}
	
}
private static long getInt() throws IOException {
	String s = getString();
	return Integer.parseInt(s);
}
private static String getString() throws IOException{
	InputStreamReader isr = new InputStreamReader(System.in);
	BufferedReader br = new BufferedReader(isr);
	String s = br.readLine();
	return s;
}
private static int getChar() throws IOException {
	String s = getString();
	return s.charAt(0);
}

}
enter first letter of show,reset, next,get,before,after,delete:s
20 40 60 80  
enter first letter of show,reset, next,get,before,after,delete:r
enter first letter of show,reset, next,get,before,after,delete:n
enter first letter of show,reset, next,get,before,after,delete:n
enter first letter of show,reset, next,get,before,after,delete:g
returned 60
enter first letter of show,reset, next,get,before,after,delete:b
enter value to insert: 55
enter first letter of show,reset, next,get,before,after,delete:a
enter value to insert: 77
enter first letter of show,reset, next,get,before,after,delete:s
20 40 55 77 60 80  
enter first letter of show,reset, next,get,before,after,delete:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class TriangleApp
{
	static int theNumber;
	public static void main(String[] args) throws IOException
	{
		System.out.print("enter a number: ");
		theNumber = getInt();//将getInt得到的s赋值给theNumber
		int theAnswer = triangle(theNumber);//将triangle中得到的theNumber赋值给theAnswer
		System.out.println("Triangle=" + theAnswer);//输出theAnswer
	}
	public static int triangle(int n)
	{
		if(n==1)                //如果n=1
			return 1;           //返回1
		else                          
			return(n+triangle(n-1));    //否则返回n+triangle的n-1的结果
	}
	
	public static int getInt() throws IOException
	{
		String s = getString();           //getString的值赋值给s
		return Integer.parseInt(s);        //返回给s
	}
	public static String getString() throws IOException
	{
		InputStreamReader isr = new InputStreamReader(System.in);   //建立输入的isr
		BufferedReader br = new BufferedReader(isr);                //将isr输入br中
		String s = br.readLine();                                   //将br输入s
		return s;                                                   //返回s
	}
}
enter a number: 555
Triangle=154290

调用递归方法,自己调用自己

以下为详细过程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class TriangleApp
{
	static int theNumber;
	public static void main(String[] args) throws IOException
	{
		System.out.print("enter a number: ");
		theNumber = getInt();
		int theAnswer = triangle(theNumber);
		System.out.println("Triangle=" + theAnswer);
	}
	public static int triangle(int n)
	{
		System.out.println("enter:n=" + n);
		if(n==1)
		{
			System.out.println("returning 1");
			return 1;
		}
		else
		{
			int temp = n + triangle(n-1);
			System.out.println("returning "+temp);
			return temp;
		}
	}
	
	public static int getInt() throws IOException
	{
		String s = getString();
		return Integer.parseInt(s);
	}
	public static String getString() throws IOException
	{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		return s;
	}
}

 triangle()方法调用自身时,它的参数从10开始,每次减一,这个发那个发反复进入自身,直到方法的参数减小到1,于是方法返回,这会引发一系列的返回序列。这个方法向凤凰涅盘一样的返回,脱离被放弃的那一层,每当返回时,这个方法把调用它的参数n与其调用下一层方法的返回值相加。

注意:在最内层返回1之前,实际上在同一时刻有10个不同的triangle()方法实例存在,最外层传入的参数是10,最内层传入的参数是1.

enter a number: 10
enter:n=10
enter:n=9
enter:n=8
enter:n=7
enter:n=6
enter:n=5
enter:n=4
enter:n=3
enter:n=2
enter:n=1
returning 1
returning 3
returning 6
returning 10
returning 15
returning 21
returning 28
returning 36
returning 45
returning 55
Triangle=55

基于循环的方法效率更高

变位数

输入一个单词,将字母进行排列,将所有结果都排列组合出来;

利用递归,从第一个单词开始向右移动,每两个字母换一次位置,直到将所有可能都列出。

doAnagram()每次调用自己的时候,词的大小都减少一个字母,并且开始i的位置向右移动一位。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


class AnagramApp {
	static int size;
	static int count;
	static char[] arrChar = new char[100];
	public static void main(String[] args) throws IOException
	{
		System.out.print("enter a word: ");
		String input = getString();
		size = input.length();
		count = 0;
		for(int j=0;j<size;j++)
		arrChar[j] = input.charAt(j);
		doAnagram(size);
	}
	private static void doAnagram(int newSize) {
		// TODO Auto-generated method stub
		if(newSize==1)
			return;
		for(int j=0;j<newSize;j++)
		{
			doAnagram(newSize-1);
			if(newSize==2)
				displayWord();
			rotate(newSize);
		}
	}
	private static void rotate(int newSize) {
		// TODO Auto-generated method stub
		int j;
		int position = size - newSize;
		char temp = arrChar[position];
		for(j=position+1;j<size;j++)
		{
			arrChar[j-1] = arrChar[j];
			arrChar[j] = temp;
		}
	}
	private static void displayWord() {
		// TODO Auto-generated method stub
		if(count < 99)
			System.out.print(" ");
		if(count < 9)
			System.out.print(" ");
		System.out.print(++count+" ");
		for(int j=0;j<size;j++)
			System.out.print(arrChar[j]);
		System.out.print(" ");
		System.out.flush();
		if(count%6==0)
			System.out.println("");
	}
	private static String getString() throws IOException {
		// TODO Auto-generated method stub
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		return s;
	}
}
enter a word: dog
  1 dog   2 dgo   3 ogd   4 odg   5 gdo   6 god 

 

转载于:https://my.oschina.net/u/3829307/blog/1924196

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值