203.移除链表元素
- 本题可以参考我的另一篇博客Java数据结构——链表
- 反正对于单向链表的插入 或者是 删除 操作的话,一定要谨记,一定要设置一个pre结点,用来指向我当前结点的上一个结点。
以下是两种不同的代码实现方式:
具体代码实现:
1、使用实际的头结点
/**
* 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 removeElements(ListNode head, int val) {
if(head==null)
return head;
ListNode pre=head;
ListNode temp=pre.next;
//因为在上面已经把头结点为空的情况额外判断了
//所以这里头结点一定不为空,temp就从head.next开始(这里要记住还没判断head.val是否等于val)
while(temp!=null){
if(temp.val==val){
pre.next=temp.next;
temp=pre.next;
}
else{
pre=pre.next;
temp=temp.next;
}
}
//因为循环中并没有判断head.val是否等于val 所以循环结束的时候要额外判断一下
if(head.val==val){
head=head.next;
}
return head;
}
}
2、使用虚拟头结点
/**
* 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 removeElements(ListNode head, int val) {
//创建一个虚拟头结点,并将其next指向head.
ListNode fakeHead=new ListNode();
fakeHead.next=head;
//正是因为使用了虚拟头结点,所以pre能够从fakehead开始,temp可以直接从head开始判断
ListNode pre=fakeHead;
ListNode temp=pre.next;
while(temp!=null){
if(temp.val==val){
pre.next=temp.next;
temp=pre.next;
}
else{
pre=pre.next;
temp=pre.next;
}
}
head=fakeHead.next;
return head;
}
}
707.设计链表
由于在Java数据结构——链表 中已经涉及到单链表的设计,故而这里不再赘述。
206.反转链表
/**
* 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) {
if(head==null){
return head;
}
//个人将虚拟头结点贯彻到底
//创建一个虚拟头结点指向原链表的head
ListNode fakeHead=new ListNode();
fakeHead.next=head;
//temp结点就是我每次要判断的结点
ListNode temp=fakeHead.next;
//resultFakeHead是我结果链表的虚拟头结点
ListNode resuleFakeHead=new ListNode();
while(temp!=null){
//原链表先断
fakeHead.next=temp.next;
//resultFakeHead那边的链表接上
temp.next=resuleFakeHead.next;
resuleFakeHead.next=temp;
//然后temp又回归原链表
temp=fakeHead.next;
}
return resuleFakeHead.next;
}
}