这两个面试经常被问到两个常见算法

单向链表的反转

public class LinkedNode {
Integer id;
LinkedNode next;

public LinkedNode(Integer id) {
this.id = id;
}
}
//创建链表
LinkedNode node1 = new LinkedNode(1);
LinkedNode node2 = new LinkedNode(2);
LinkedNode node3 = new LinkedNode(3);

//递归该方法
public LinkedNode reverseList(LinkedNode node) {
// 如果为空链表或者只有一个节点的链表则不需要处理
if (node == null || node.next == null) {
return node;
}
// 递归直到找到尾结点
LinkedNode newHead = reverseList(node.next);
// 尾节点反指
node.next.next = node;
// 当前节点指向null节点
node.next = null;
return newHead;
}


根据某个节点进行反转
public  LinkedNode reverseKGroup1(LinkedNode head, int k) {
if(head == null || head.next == null || k < 2)
return head;
LinkedNode dummy = new LinkedNode(1);
dummy.next = head;
LinkedNode pre = dummy, cur = head, temp;
int len = 0;
while (head != null) {
len ++ ;
head = head.next;
}
for (int i = 0; i < len / k; i ++ ) {
for (int j = 1; j < k; j ++ ) {
temp = cur.next;
cur.next = temp.next;
temp.next = pre.next;
pre.next = temp;
}
pre = cur;
cur = cur.next;
}
return dummy.next;
}








原文地址:https://www.cnblogs.com/liunx1109/p/14334106.html