2022-5-14 链表
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode deleteDuplicates(ListNode head) { 13 ListNode point=head; 14 while (point!=null&&point.next!=null){ 15 if (point.val==point.next.val){ 16 point.next=point.next.next; 17 }else { 18 point=point.next; 19 } 20 } 21 return head; 22 } 23 }
思路:指针从头遍历,跳过重复的。
给你单链表的头指针
head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public ListNode reverseBetween(ListNode head, int left, int right) { 13 ListNode left_pre=null,right_next=null,point=head,l=null,r=null; 14 for (int i=0;i<right;i++){ 15 if (i==left-1) l=point; 16 if (i==left-2) left_pre=point; 17 if (i==right-1) r=point; 18 point=point.next; 19 } 20 right_next=r.next; 21 if (left_pre==null) { 22 head=reverser(l,r); 23 left_pre=head; 24 } 25 else { 26 left_pre.next=reverser(l,r); 27 } 28 while (left_pre.next!=null){ 29 left_pre=left_pre.next; 30 } 31 left_pre.next=right_next; 32 return head; 33 } 34 35 36 public ListNode reverser(ListNode left,ListNode right){ 37 ListNode pre=null,cur=left,next=left; 38 while (pre!=right){ 39 next=cur.next; 40 cur.next=pre; 41 pre=cur; 42 cur=next; 43 } 44 return pre; 45 } 46 }
思路:迭代实现,找到对应的两个节点实现反转后再拼接。需要注意left可能为1的情况。