输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思路1:定义三个指针,分别是当前要反转的结点,它的前一个结点和后一个结点。
思路2:用递归。先找到倒数后两个结点反转,依次向前。
以下是本题Java实现:
class ListNode{
int value;
ListNode next;
public ListNode(int x) {
value = x;
}
}
public class ReverseList {
private ListNode reverseList(ListNode headNode){
if(headNode == null){
System.out.println("输入头结点为空");
return null;
}
ListNode nowNode = headNode;//当前要反转的结点
ListNode preNode = null;//前一个结点
ListNode nextNode = null;//后一个结点
ListNode revHead = null;//反转后的头结点
while(nowNode != null){
if(nowNode.next == null){//反转后的头结点是之前的尾结点
revHead = nowNode;
}
nextNode = nowNode.next;
nowNode.next = preNode;
preNode = nowNode;
nowNode = nextNode;
}
return revHead;
}
private void print(ListNode headNode){
if(headNode == null){
System.out.println("输入头结点为空");
return;
}
while(headNode != null){
System.out.println(headNode.value);
headNode = headNode.next;
}
}
//递归方法(不太好理解)
private ListNode digui(ListNode headNode){
//判断链表为空或者链表中只有一个元素
if(headNode == null || headNode.next == null){
return headNode;
}else{
ListNode revHead = digui(headNode.next);//先反转后面的链表
headNode.next.next = headNode;//反转
headNode.next = null;
return revHead;
}
}
public static void main(String[] args) {
ListNode one = new ListNode(1);
ListNode two = new ListNode(2);
ListNode three = new ListNode(3);
one.next = two;
two.next = three;
ReverseList test = new ReverseList();
System.out.println("反转前:");
test.print(one);
System.out.println("反转后:");
//test.print(test.reverseList(one));
test.print(test.digui(one));
}
}
输入两个递增的链表,合并这两个链表并使新链表仍然是递增的。
思路:递归。每次比较两个链表的第一个结点,提出小的,然后它的next等于递归返回值。
本题Java实现如下:
public class Merge {
private ListNode merge(ListNode L1,ListNode L2){
if(L1 == null){
return L2;
}else if(L2 == null){
return L1;
}
ListNode mergeHead = null;
if(L1.value < L2.value){
mergeHead = L1;
mergeHead.next = merge(L1.next, L2);
}else{
mergeHead = L2;
mergeHead.next = merge(L1, L2.next);
}
return mergeHead;
}
//尾插法建立链表
private ListNode create(int[] arr){
if(arr.length == 0){
System.out.println("输入数组为空");
return null;
}
ListNode headNode = new ListNode(arr[0]);
ListNode p = headNode;
for(int i= 1;i