力扣题目链接 (opens new window)
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路:
普通做法
中间节点: head给前一个的next next给后一个的head
首元节点: head移动到下一个的head (head next)
临时指针:head.next
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head!=null&&head.val==val){
head=head.next;
}
if(head==null){
return head;
}
ListNode pre=head;
ListNode cur=head.next;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
}else{
pre=cur;
}
cur=cur.next;
}
return head;
}
}
虚拟头节点做法
链表中再加入一个首元节点 这样就可以统一代码
临时指针:head
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return head;
}
ListNode dummy=new ListNode(-1,head);
ListNode pre=dummy;
ListNode cur=head;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
}else{
pre=cur;
}
cur=cur.next;
}
return dummy.next;
}
}
力扣题目链接(https://leetcode.cn/problems/design-linked-list/)
题意:
在链表类中实现这些功能:
class listNode{
int val;
listNode next;
listNode(){
}
listNode(int val){
this.val=val;
}
}
class MyLinkedList {
int size;//定义链表长度
ListNode dummyhead;//定义虚拟头节点
public MyLinkedList() {
int size=0;
dummyhead=new ListNode(0); //初始化
}
//获取第n个节点的数值,注意index是从0开始的,第0个节点就是头结点
public int get(int index) {
if(index<0||index>size-1){
return -1;
}
ListNode cur=dummyhead.next; //临时指针指向头节点
for(int i=0;i<=index;i++){
cur=cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
ListNode newnode=new ListNode(val);
newnode.next=dummyhead.next;
dummyhead.next=newnode;
size++;
}
public void addAtTail(int val) {
ListNode newnode=new Listnode(val);
ListNode cur=dummyhead;
while(cur.next!=null){
cur=cur.next;
}
cur.next=newnode;
size++;
}
public void addAtIndex(int index, int val) {
if(index>size){
return;
}
if(index<0){
index=0;
}
Listnode newnode=new Listnode(val);
Listnode cur=dummyhead;
for(int i=0;i<index,i++){
cur=cur.next;
}
newnode.next=cur.next
cur.next=newnode
size++;
}
public void deleteAtIndex(int index) {
if(index<0||index>size-1){
return;
}
if(index==0){
dummyhead=dummyhead.next;
return;
}
ListNode cur=dummyhead;
for(int i=0;i<index;i++){
cur=cur.next;
}
cur.next=cur.next.next;
size--;
}
}
https://leetcode.cn/problems/reverse-linked-list/
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
思路:
双指针解法:
双指针:一个cur 一个pre
cur指向head
pre往head前指 初始化为Null
反转以后head就是尾节点,尾节点就指向null
什么时候遍历结束?
pre指向尾节点,cur指向null时
没赋值之前,先用临时指针,把cur的下一个节点保存下
最后返回新链表的头节点,pre
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 reverseList(ListNode head) {
return reverse(null, head);
}
private ListNode reverse(ListNode pre, ListNode cur) {
if (cur == null) {
return pre;
}
ListNode temp = null;
temp = cur.next;// 先保存下一个节点
cur.next = prev;// 反转
// 更新prev、cur位置
// prev = cur;
// cur = temp;
return reverse(cur, temp);
}
}