力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点
Posted 王嘻嘻-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点相关的知识,希望对你有一定的参考价值。
目录
203.移除链表元素
源代码👇
https://leetcode-cn.com/problems/remove-linked-list-elements/
public class Num203
public static void main(String[] args)
//创建一个相同的链表
//[1,2,6,3,4,5,6]
ListNode head = build();
Num203 num203 = new Num203();
ListNode newHead = num203.removeElements(head,6);
System.out.println(newHead);
private static ListNode build()
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(6);
ListNode node4 = new ListNode(3);
ListNode node5 = new ListNode(4);
ListNode node6 = new ListNode(5);
ListNode node7 = new ListNode(6);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
return node1;
/**
* 递归
* 给定一个头节点head的链表 就可以删除链表中所有值val节点
* @param head
* @param val
* @return 返回删除后的头节点
*/
public ListNode removeElements(ListNode head, int val)
if (head == null)
return null;
//将head.next以及之后的节点处理交给 removeElements(head.next,val)
head.next = removeElements(head.next,val);
if (head.val == val)
return head.next;
return head;
//移除单链表val节点,返回删除后链表的头节点
// public ListNode removeElements(ListNode head, int val)
// //头节点就是待删除的节点
// while(head != null && head.val ==val)
// head = head.next;
//
// if (head == null)
// return null;
// else
// //此时头节点一定不是待删除节点且链表不为空
// ListNode prev = head;
// while (prev.next != null)
// if (prev.next.val == val)
// ListNode cur = prev.next;
// prev.next = cur.next;
// else
// prev=prev.next;
//
//
//
// return head;
//
83.删除排序链表中重复元素
源代码👇
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
package leetcode;
public class Num83
/**
* 删除排序链表的重复元素,重复元素保留一次
* @param head
* @return
*/
public ListNode deleteDuplicates(ListNode head)
ListNode dummyHead = new ListNode(101);//虚拟头节点
dummyHead.next = head;
ListNode prev = dummyHead;
ListNode cur = prev.next;
while (cur!=null)
if (prev.val == cur.val)
prev.next = cur.next;//删除cur
else
prev=prev.next;//不相等,prev 和 cur都向后移一个单位
cur=cur.next;
return dummyHead.next;
82.删除排序链表中重复元素Ⅱ
源代码👇
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/submissions/
package leetcode;
public class Num82
public ListNode deleteDuplicates(ListNode head)
ListNode dummyHead = new ListNode(101);
dummyHead.next = head;
ListNode prev = dummyHead;
ListNode cur = prev.next;
while (cur!=null)
ListNode next = cur.next;
if (next == null)
return dummyHead.next;
else
// 此时链表中至少有两个节点
if (cur.val == next.val)
// cur和next重复
// 让next一直向后移动,直到走到第一个与cur.val不相等的节点
while (next != null && cur.val == next.val)
next = next.next;
// prev - 第一个重复节点的前驱
// next - 最后一个重复节点的后继
// prev - next全是重复元素,需要删除
prev.next = next;
// prev不动,cur走到当前next继续判断后面是否还有重复元素
cur = next;
else
// cur与next不重复
prev = prev.next;
cur = cur.next;
return dummyHead.next;
206.反转链表
源代码👇
https://leetcode-cn.com/problems/reverse-linked-list/submissions/
package leetcode;
import java.util.List;
//反转链表
public class Num206
//头插法
// public ListNode reverseList(ListNode head)
// ListNode dummyHead = new ListNode(5001);
// if (head==null || head.next==null)
// return head;
//
// // 边遍历原链表,边头插新链表
// while (head!=null)
// ListNode node = new ListNode(head.val);
// node.next = dummyHead.next;
// dummyHead.next = node;
// head = head.next;
//
// return dummyHead.next;
//
//
//原地移动法
// public ListNode reverseList(ListNode head)
// if (head==null||head.next==null)
// return head;
//
// ListNode prev = null;
// //当前需要处理的节点(需要反转)
// ListNode cur = head;
// while (cur!=null)
// // 暂存一下下一个需要处理的节点
// ListNode next = cur.next;
// cur.next=prev;
// prev = cur;
// cur = next;
//
// return prev;
//
//
//递归法
public ListNode reverseList(ListNode head)
if (head==null||head.next==null)
return head;
ListNode sec = head.next;
// 反转第二个节点之后的子链表
ListNode newHead = reverseList(head.next);
sec.next = head;
head.next = null;
return newHead;
876.链表的中间节点
源代码👇
https://leetcode-cn.com/problems/middle-of-the-linked-list/
package leetcode;
public class Num876
//快慢指针法
public ListNode middleNode(ListNode head)
//fast一次走两步,low一次走一步
ListNode fast = head;
ListNode low = head;
while (fast!=null&&fast.next!=null)
fast=fast.next.next;
low=low.next;
return low;
本小节完^_^
以上是关于力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点的主要内容,如果未能解决你的问题,请参考以下文章