자바 링크 면접 프로 그래 밍 문제
18725 단어 자바 기초 데이터 구조의 링크
1. 두 개의 체인 시 계 는 각자 증가 한 것 으로 합 친 후의 체인 시 계 는 단 조 롭 고 감소 하지 않 는 다.
/**
* 两个递增的单链表合并保持单调递增
*
* 递归求解
* @param firstNode
* @param secondNode
* @return
*/
public Node mergeNode(Node firstNode,Node secondNode){
if (firstNode==null)return secondNode;
if (secondNode==null)return firstNode;
Node mergeNode = null;
if (firstNode.datadata){
mergeNode = firstNode;
mergeNode.next = mergeNode(firstNode.next,secondNode);
}
else {
mergeNode = secondNode;
mergeNode.next = mergeNode(firstNode,secondNode.next);
}
return mergeNode;
}
2 단일 링크 정렬
/**
* 单链表排序
* 归并排序
*/
public Node sortNode(Node head){
if(head == null|| head.next == null){
return head;
}
Node mid = middleNode(head);
Node right = sortNode(mid.next);
mid.next = null;
Node left = sortNode(head);
return merge(left, right);
}
/**
* 合拼排好序的子链表
* @param n1
* @param n2
* @return
*/
private Node merge(Node n1,Node n2){
Node dummy = new Node(0);
Node node = dummy;
while (n1!=null&&n2!=null) {
if(n1.datadata){
node.next = n1;
n1 = n1.next;
}else{
node.next = n2;
n2 = n2.next;
}
node = node.next;
}
if(n1!=null){
node.next = n1;
}else{
node.next = n2;
}
return dummy.next;
}
/**
* 寻找链表中间值
* @param head
* @return
*/
private Node middleNode(Node head){
Node slow = head;
Node fast = head.next;
while(fast!=null&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
3 단일 체인 테이블 전체 반전
/**
* 递归方式-进行反转
* @param node
* @return
*/
private Node reverseNodeByDG(Node head){
if(head.next == null){
return head;
}
Node reverseNode = reverseNodeByDG(head.next);
head.next.next = head;
head.next = null;
return reverseNode;
}
/**
* 遍历方式-进行反转
* @param node
* @return
*/
private Node reverseNodeByBL(Node node){
Node prev = null;
while(node!=null){
Node tmp = node.next;
node.next = prev;
prev = node;
node = tmp;
}
return prev;
}
4 단 사슬 표 n 에서 m 위치 로 의 반전
/**
* 翻转链表的n到m之间的节点
*/
Node reverseFromNTOM(Node head,int m,int n){
if(m>=n||head == null){
return head;
}
Node dummy = new Node(0);
dummy.next = head;
head = dummy;
for(int i = 1;i;i++){
if(head == null){
return null;
}
head = head.next;
}
Node pmNode = head;
Node mNode = head.next;
Node nNode = mNode;
Node pnNode = mNode.next;
for(int i = m;i;i++){
if(pnNode == null){
return null;
}
Node tmp = pnNode.next;
pnNode.next = nNode;
nNode = pnNode;
pnNode = tmp;
}
pmNode.next = nNode;
mNode.next = pnNode;
return dummy.next;
}
5. 단일 체인 표 는 지 정 된 값 에 따라 분할 된다.
/**
* 单链表分区
* 小于x的结点排在大于或等于x的结点之前
*/
public Node nodePartition(Node head,int x){
if(head == null){
return null;
}
Node left = new Node(0);
Node right = new Node(0);
Node leftNode = left;
Node rightNode = right;
while(head!=null){
if(head.datanext = head;
left = head;
}else{
right.next = head;
right = head;
}
head = head.next;
}
left.next = rightNode.next;
right.next = null;
return leftNode.next;
}