Java与算法(5)

来源:互联网 发布:im短域名 编辑:程序博客网 时间:2024/05/16 10:38

Java与算法(5)

题目:

反转单链表和双链表

public class ReverseLink {public static class Node {int data;Node next;public Node(int data) {// TODO Auto-generated constructor stubthis.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 stubthis.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 stubthis.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));}}