序言
要开始刷题了,上学期划了一学期水,这学期要好好努力了,一天至少一道力扣,冲!
题目
先上最简单的链表反转,codetop的频次第一名
题解
没有头结点真的好不方便…
好久没用c++或者java了,语法都快忘完了
迭代
关键是要有一个结点记录前一个结点,然后可以画图试,感觉和考研时的算法题差不多
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null;//前一个结点
ListNode curr=head;
while(curr!=null){
ListNode next=curr.next;//后一个结点
curr.next=pre;
pre=curr;
curr=next;
}
return pre;
}
}
递归
复杂度高且难理解,但是面试也有出到,所以也要掌握
关键是下面这张图:
class Solution {
public ListNode reverseList(ListNode head) {
if (head==null || head.next==null)
return head;
ListNode newHead=reverseList(head.next);//为了到达最后一个结点
head.next.next=head;//关键
head.next=null;
return newHead;
}
}
head.next=null;
return newHead;
}
}