leetcode刷题汇总
目录汇总
链表部分
203. 移除链表元素
删除链表中等于给定值 *val* 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
java代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
//忘了把这个结点和头结点联结起来
dummyHead.next=head;
//忘了给他找个替身
ListNode prev=dummyHead;
while(prev.next!=null){
if (prev.next.val==val){
ListNode delNode=prev.next;
prev.next=delNode.next;
delNode.next=null;
}else {
prev=prev.next;
}
}
return dummyHead.next;
}
}
C++代码
/*这里加一个疑问?
如何在leetcode使用虚拟头结点,主要是初始化问题,不能直接对其赋值为NULL
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyhead=new ListNode(-1);
//这里使用的结构体初始化
dummyhead->next=head;
//最后会返回虚拟头结点,所以虚拟头结点不能动,再加上一个头结点
ListNode* pre=dummyhead;
while(pre->next!=NULL)
{
//这个时候开始判断
if(pre->next->val==val){
pre->next=pre->next->next;
}
else{
pre=pre->next;
}
}
return dummyhead->next;
}
};
206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
迭代方法:
C++代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre=NULL;
//定义一个空指针,作为拆分链表时候的头结点
ListNode* cur=head;
//将头结点的值直接赋值给cur
//有一个危险的地方,我们使用cur->val的时候,head为null会发生危险
while(cur!=NULL)
{
ListNode* next=cur->next;
cur->next=pre; //cur指向pre结点
pre=cur; //头结点后移
cur=next; //cur向下一个结点移动
}
return pre;
}
};