java实现单链表的翻转

_flowers_ss 2016-03-29 09:38:32
我写了一个递归的方法reverse()运行出的结果是testlinklist.Node@4aa298b7;
然后还有一个reverse2 ()的方法写到那边写不下去了 求大神教
import java.util.Scanner;
class Node {

protected int data; //数据
protected Node next; //后续

public Node(int data, Node next) {
setData(data); //设数据
setNext(next); //设后续
}

public Node(int data) {
this(data, null); //无后续
}

public Node() {
this(0, null); //无数据,无后续
}

public void setData(int data) {
this.data = data;
}

public void setNext(Node next) {
this.next = next;
}

public int getData() {
return data;
}

public Node getNext() {
return next;
}
}

class LinkList {

protected Node head; // 单链表的头指针
protected int size=0;
public LinkList() { // 单链表的构造方法
head = new Node(0, null); // 初始化头结点,空表
}

public void create(int n) { //用n个数据建立链表
Scanner sc = new Scanner(System.in);
Node p = head, s;
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + i + "个结点的数据:");
s = new Node(sc.nextInt());
p.setNext(s);
p = s;
++size;
}
}

public void print() {
Node p = head.getNext(); //从有数据的开始
while (p != null) {
System.out.print(p.getData() + " ");
p = p.getNext();
}
System.out.println();
}

public void insert(int i, int x) { //插入
Node p = head; //有表头,表头相当于-1号结点
int j = -1;
while (p != null && j < i - 1) { //插到i号结点前,先要定位到i-1号结点
p = p.getNext(); //查找成功时,p是i-1号结点
++j;
} //循环结束时p=null或j>i-1或j=i-1,前两种失败
if (i < 0 || p == null) { // i<0,或i-1号结点超出链表尾
System.out.println("插入位置不合法");
} else {
Node s = new Node(x); //创建新结点
s.setNext(p.getNext()); //新结点的后续设为原i号节点
p.setNext(s); //原i-1号结点的后续设为新节点
}
}

public void remove(int i){ //删除
Node p = head;
int j = -1;
while (p.getNext() != null && j < i - 1) { //找到第i-1个结点
p = p.getNext(); //查找成功时,p是i-1号结点
++j;
}
if (i < 0 || p.getNext() == null) { // i<0或i-1号是链表尾
System.out.println("删除位置不合法");
} else {
p.setNext(p.getNext().getNext()); //变为下一个的下一个
}
}

public static Node reverse(Node head){
if(head==null||head.getNext()==null){
return head;
}
Node reverseHead=reverse(head.getNext());
head.getNext().setNext(head);
head.setNext(null);
return reverseHead;
}

public void reverse2(Node head){
for(int i=0;i<size;++i){
insert(remove);
}
}
}

public class TestLinkList {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
LinkList ls = new LinkList(); //空表
Node head= new Node(0);
ls.create(5);
ls.print();
System.out.println(ls.reverse(head));
}

}
...全文
282 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_flowers_ss 2016-03-31
  • 打赏
  • 举报
回复
引用 6楼三仙半 的回复:
链表的操作真的不需要用递归,硬要用的也没什么不可以的,就是效率会差一些

    //供外界调用的入口方法
	public void reverse2()
	{
        //我是从链表的第一个节点开始递归的,按理说从头结点开始递归更通用一些吧?
		reverse2_step(head.getNext());
	}
    //这是递归式实现逆序的方法
	private Node reverse2_step(Node node)
	{
		if (node == null)
		{
			return null;
		}
		Node next = node.getNext();
		if (next == null)
		{
			this.head.setNext(node);
		}
		else
		{
			Node tmp = reverse2_step(next);
			node.setNext(tmp.getNext());
			tmp.setNext(node);
		}
		return node;
	}
感谢你~我就多学几种方法 毕竟刚学
dongtao1010 2016-03-30
  • 打赏
  • 举报
回复

public Node reverList(Node head){
      if(head == null || head.next == null){
             return head;
      }
      Node reHead = null;
      Node curr = head;

      while(curr != null){
      Node preCurr = curr;
      curr = curr.next;
      preCurr.next = reHead;
      reHead = preCurr;

       }
       return reHead;
}
上面的代码我这儿是编译通过的,你自己可能要改下你的Node类
三仙半 2016-03-30
  • 打赏
  • 举报
回复

public void reverse()
	{
		Node current = this.head.next;
		if (current == null)
		{
			return;
		}
		Node next = current.getNext();
		current.setNext(null);
		Node tmp;
		while (next != null)
		{
			tmp = next.getNext();
			next.setNext(current);
			current = next;
			this.head.setNext(current);
			next = tmp;
		}
	}
xiaolong806124 2016-03-30
  • 打赏
  • 举报
回复
我觉得reverse另一种实现方式,可以用两个指针指向链表的首尾。两个指针相向移动,只交换两指针的值。
三仙半 2016-03-30
  • 打赏
  • 举报
回复
链表的操作真的不需要用递归,硬要用的也没什么不可以的,就是效率会差一些

    //供外界调用的入口方法
	public void reverse2()
	{
        //我是从链表的第一个节点开始递归的,按理说从头结点开始递归更通用一些吧?
		reverse2_step(head.getNext());
	}
    //这是递归式实现逆序的方法
	private Node reverse2_step(Node node)
	{
		if (node == null)
		{
			return null;
		}
		Node next = node.getNext();
		if (next == null)
		{
			this.head.setNext(node);
		}
		else
		{
			Node tmp = reverse2_step(next);
			node.setNext(tmp.getNext());
			tmp.setNext(node);
		}
		return node;
	}
_flowers_ss 2016-03-30
  • 打赏
  • 举报
回复
引用 4楼我是你的主体 的回复:
[quote=引用 2楼三仙半 的回复:]

public void reverse()
	{
		Node current = this.head.next;
		if (current == null)
		{
			return;
		}
		Node next = current.getNext();
		current.setNext(null);
		Node tmp;
		while (next != null)
		{
			tmp = next.getNext();
			next.setNext(current);
			current = next;
			this.head.setNext(current);
			next = tmp;
		}
	}
用了你的方法 然后在public里Systen.out.println(ls.reverse());显示错误不允许使用空类型 怎么解决啊 还有可以问下如果用递归方法怎么做吗[/quote]知道原因了直接ls.reverse();再调运print()方法
_flowers_ss 2016-03-30
  • 打赏
  • 举报
回复
引用 2楼三仙半 的回复:

public void reverse()
	{
		Node current = this.head.next;
		if (current == null)
		{
			return;
		}
		Node next = current.getNext();
		current.setNext(null);
		Node tmp;
		while (next != null)
		{
			tmp = next.getNext();
			next.setNext(current);
			current = next;
			this.head.setNext(current);
			next = tmp;
		}
	}
用了你的方法 然后在public里Systen.out.println(ls.reverse());显示错误不允许使用空类型 怎么解决啊 还有可以问下如果用递归方法怎么做吗

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧