文章目录
day03学习内容
day03主要内容
- 链表理论基础
- 移除链表元素
- 设计链表
- 翻转链表
一、 移除链表元素
1.错误写法1
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(-1,head);
if(head == null){
return head;
}
ListNode cur = head;
while(cur.next!=null){
if(cur.next.val==val){
cur.next = cur.next.next;
}else {
cur = cur.next;
}
}
return dummy.next;
}
}
为啥不能这么写呢。假设链表是5->7->2->null,需要删除5,声明ListNode cur = head,cur指向5这个元素,在while循环里面(每次循环都是cur.next)就会把第一个节点给跳过,会导致符合条件的节点没有被删除,所以不能这么写。
2.错误写法2
总结起来就是依托答辩,既不像单指针又不像双指针,不知道怎么形容了。。
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
ListNode dummy = new ListNode(-1, head);
ListNode cur = head;
while (cur != null) {
if (cur.val == val) {
dummy.next = cur.next;
} else {
dummy = cur;
}
cur = cur.next;
}
return dummy.next;
}
}
用脑袋想想,肯定不能移动dummy的指向,一直移动dummy,最后返回null了。如下图,入参head=1->2->3->null
2.正确写法1
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(-1,head);
if(head == null){
return head;
}
ListNode cur = dummy;
while(cur.next!=null){
if(cur.next.val==val){
cur.next = cur.next.next;
}else {
cur = cur.next;
}
}
return dummy.next;
}
}
2.正确写法2
`采用双指针
class Solution {
public static ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
ListNode dummy = new ListNode(-1, head);
ListNode prev = dummy;
ListNode cur = head;
while (cur != null) {
if (cur.val == val) {
prev.next = cur.next;
} else {
prev = cur;
}
cur = cur.next;
}
return dummy.next;
}
}
二、设计链表
答案略
三、翻转链表
1.错误写法1
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode newList = new ListNode(-1);
ListNode prev = newList;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = prev;
prev = cur;//为什么要先移动prev指针,建议画图跑一下就明白了
cur = temp;
}
return prev;
}
}
这样为什么是错的呢,很明显,构造了一个非空的虚拟头结点,假如入参head=[1,2,3,4,5],最后会输出[5,4,3,2,1,-1],会把-1也给带出来。
1.正确写法1-双指针
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode newList = null;
ListNode prev = newList;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = prev;
prev = cur;
cur = temp;
}
return prev;
}
}