1.逆置链表
class Node {
int value;
Node next;
}
public class Main {
public static Node reverse(Node head) {
// 遍历,把每个结点头插到新链表中
// 指向新链表的第一个结点
Node result = null;
Node cur = head;
while (cur != null) {
Node next = cur.next;
// 把 cur 头插到新链表中
cur.next = result;
result = cur;
cur = next;
}
return result;
}
public static Node reverse2(Node head) { //递归思想
if (head == null || head.next == null) {//空链表或只有一个结点
return head;
}
Node result = reverse2(head.next);
head.next.next = head;
head.next = null;
return result;
}
}
2.合并有序链表
思路:将原链表中结点的值进行比较 数值较小的尾插到新链表上
merge1:常规方法 注意链表为空的情况
merge2:新链表开始就有一个结点 好处是不用处理新链表尾插时新链表为空的情况 注意最后返回的是result.next
class Node {
int value;
Node next;
}
public class Main {
public static Node merge(Node head1, Node head2) {
if (head1 == null) {
return head2;
}
if (head2 == null) {
return head1;
}
Node cur1 = head1;
Node cur2 = head2;
Node result = null;
Node last = null; //尾插是最后一个结点记为last
while (cur1 != null && cur2 != null) {
if (cur1.value <= cur2.value) { //cur1尾插到result
if (result == null) {
result = cur1;
} else {
last.next = cur1;
}
last = cur1;
cur1 = cur1.next;
} else { //cur2尾插到result
if (result == null) {
result = cur2;
} else {
last.next = cur2;
}
last = cur2;
cur2 = cur2.next;
}
}
if (cur1 != null) {
last.next = cur1;
} else {
last.next = cur2;
}
return result;
}
public static Node merge2(Node head1, Node head2) {
Node cur1 = head1;
Node cur2 = head2;
Node result = new Node();
Node last = result; //不用处理新链表尾插为空的情况 不用分情况讨论
while (cur1 != null && cur2 != null) {
if (cur1.value <= cur2.value) {
last.next = cur1;
cur1 = cur1.next;
} else {
last.next = cur2;
cur2 = cur2.next;
}
last = last.next;
}
if (cur1 != null) {
last.next = cur1;
} else {
last.next = cur2;
}
return result.next; //注意 返回result.next
}
}