Java与算法(5)
题目:
反转单链表和双链表
public class ReverseLink {
public static class Node {
int data;
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;
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) {
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) {
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));
}
}