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));
}
}