链表
反转链表
206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
本题题目不难,但是做法却比较多,也比较基础,这里给出三种解法。
头插法
class Solution {
public ListNode reverseList(ListNode head) {//头插即可
if (head == null || head.next == null)
return head;
ListNode p = new ListNode();
p.next = null;
ListNode q = head;
while (q != null) {
ListNode temp = q;
q=q.next;
ListNode temp1 = p.next;
p.next = temp;
temp.next = temp1;
}
return p.next;
}
}
头插法就是自然逆序
双指针法
用一个前驱节点和一个遍历节点。使用一个temp进行交换。
class Solution {
public ListNode reverseList(ListNode head) {//头插即可
ListNode pre = null;
ListNode cur = head;
ListNode temp = null;
while (cur!=null) { //当前不为空
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
递归法
class Solution {
//递归法
public ListNode reverse(ListNode pre, ListNode cur) {
if (cur == null) { //当前为空或者下一个为空
return pre;
}
ListNode nextcur = cur.next;
cur.next = pre;
return reverse(cur, nextcur);
}
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}
}
递归法需要两个参数,分别传入当前结点的上一个结点和当前结点。思路也类似于双指针。
初始状态认为,head前存在一个“空结点”,进行最初的调用。当程序运行到结尾时,cur已经走到最后一个结点的下一个结点。此时,pre即为最后一个结点。