Java与算法(5)

Java与算法(5)

题目:
反转单链表和双链表
public class ReverseLink {
	public static class Node {
		int data;
		Node next;
		public Node(int data) {
			// TODO Auto-generated constructor stub
			this.data = data;
		}
	}
	
	
	public Node reverse(Node head) {
		Node pre = null;
		Node next = null;
		while (head!=null) {
			next = head.next;
			head.next = pre;
			pre = head;
			head = next;
		}
		return pre;
	}
	
	public void prinf(Node head) {
		Node node = head;
		while (node!=null) {
			System.out.println(node.data);
			node=node.next;
		}
	}
	
	
	
	public static void main(String[] args) {
		Node head = new Node(1);
		head.next = new Node(5);
		head.next.next = new Node(10);
		head.next.next.next = new Node(25);
		head.next.next.next.next = new Node(30);
		ReverseLink reverseLink = new ReverseLink();
		reverseLink.prinf(head);
		System.out.println("---------");
		Node pre = reverseLink.reverse(head);
		reverseLink.prinf(pre);
	}

}
public class ReverseDLink {
		
	
	public static class Node {
		int data;
		Node previous;
		Node next;
		public Node(int data) {
					this.data = data;
			}
	}
	
	public Node reverse(Node head) {
		Node pre = null;
		Node next = null;
		while (head!=null) {
			next = head.next;
			head.next = pre;
			head.previous = next;
			pre = head;
			head = next;
		}
		return pre;
	}
	
	public void print(Node head) {
		Node node = head;
		while (node!=null) {
			System.out.println(node.data);
			node=node.next;
		}
	}
	
	
	public static void main(String[] args) {
		Node head = new Node(1);
		head.next = new Node(3);
		head.next.next = new Node(5);
		head.next.next.next = new Node(7);
		head.next.next.next.next = new Node(9);
		ReverseDLink reverseDLink = new ReverseDLink();
		reverseDLink.print(head);
		System.out.println("-----");
		Node pre = reverseDLink.reverse(head);
		reverseDLink.print(pre);
	}

}
题目:
反转部分单链表
给定一个单链表的头节点head,以及两个整数from和to,在单链表上把from个节点到第to个节点这一部分进行反转
如:
1-2-3-4-5,from=2,to=4
调整:
1-4-3-2-5
public class ReversePart {
		
	public static class Node {
		int data;
		Node next;
		public Node(int data) {
			// TODO Auto-generated constructor stub
			this.data = data;
		}
	}
	
	public Node reverse(Node head,int start,int end) {
		int len = 0;
		Node startNode = head;
		Node sPre = null;
		Node eNext = null;
		while (startNode!=null) {
			len++;
			sPre = len==start-1?startNode:sPre;
			eNext = len==end+1?startNode:eNext;
			startNode = startNode.next;
		}
		startNode = sPre==null?head:sPre.next;
		Node node = startNode.next;
		startNode.next = eNext;
		Node next = null;
		while (node!=eNext) {
			next = node.next;
			node.next = startNode;
			startNode = node;
			node = next;
		}
		
		if (sPre!=null) {
			sPre.next=startNode;
			return head;
		}
		return startNode;
	}
	public void prinf(Node head) {
		Node node = head;
		while (node!=null) {
			System.out.println(node.data);
			node=node.next;
		}
	}
	
	
	
	
	public static void main(String[] args) {
		Node head = new Node(1);
		head.next = new Node(3);
		head.next.next = new Node(5);
		head.next.next.next = new Node(7);
		head.next.next.next.next = new Node(9);
		ReversePart part = new ReversePart();
		part.prinf(head);
		System.out.println("------------");
		part.reverse(head, 2, 5);
		part.prinf(head);
	}

}
题目:
判断一个链表是否为回文结构
public class Palindromel {
	
	public static class Node {
		int data;
		Node next;
		public Node(int data) {
			// TODO Auto-generated constructor stub
			this.data = data;
		}
	}
	
	public boolean isPalindromel(Node head) {
		Stack<Node> stack = new Stack<>();
		Node node1 = head;
		while (head!=null) {
			stack.push(head);
			head = head.next;
		}
		while (!stack.isEmpty()) {
			Node node2 = stack.pop();
			if (node1.data!=node2.data) {
				return false;
			}
			node1=node1.next;
		}
		return true;
		
		
	}
	
	
	public static void main(String[] args) {
		Node head = new Node(1);
		head.next = new Node(2);
		head.next.next = new Node(2);
		head.next.next.next = new Node(1);
		Node head1 = new Node(1);
		head1.next = new Node(3);
		head1.next.next = new Node(2);
		head1.next.next.next = new Node(1);
		Palindromel palindromel = new Palindromel();
		System.out.println(palindromel.isPalindromel(head));
		System.out.println(palindromel.isPalindromel(head1));
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值