剑指offer面试题24 p142
LeetCode第204题
本题有两种解法,迭代法和递归法:
迭代法比价好理解:代码如下:,要注意的是必须用一个tempHead来记录当前操作的下一个结点
//使用迭代的方法反转链表
public static ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head,tempHead;
while (cur!=null)
{
tempHead=cur.next;
cur.next=pre;
pre=cur;
cur=tempHead;
}
return pre;
}
递归法如下:这个方法比较抽象,读者可以自己画图模拟,或者使用debug进行调试
//使用递归的方法反转链表
public static ListNode reverseList1(ListNode head) {
if (head==null||head.next==null)
return head;
ListNode p=reverseList(head.next);
head.next.next=head;
head.next=null;
return p;
}
完整的包含测试的代码贴在下面:
public class Num206 {
public static void main(String[] args) {
int[] a = {3, 2, 5, 8, 4, 7, 6, 9};
ListNode listNode = new ListNode(a);
listNode = reverseList(listNode);
System.out.println(listNode.toString());
}
//使用迭代的方法反转链表
public static ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head,tempHead;
while (cur!=null)
{
tempHead=cur.next;
cur.next=pre;
pre=cur;
cur=tempHead;
}
return pre;
}
//使用递归的方法反转链表
public static ListNode reverseList1(ListNode head) {
if (head==null||head.next==null)
return head;
ListNode p=reverseList(head.next);
head.next.next=head;
head.next=null;
return p;
}
static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
ListNode(int[] arr) {
if (arr == null || arr.length <= 0)
throw new IllegalArgumentException("arr can not be empty");
this.val = arr[0];
ListNode cur = this;
for (int i = 1; i < arr.length; i++) {
cur.next = new ListNode(arr[i]);
cur = cur.next;
}
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
ListNode p;
for (p = this; p != null; p = p.next) {
s.append(p.val + "->");
}
s.append("NULL");
return s.toString();
}
}
}