反转链表
反转一个单链表。
public class Solution { public ListNode ReverseList(ListNode head) { //链表为空则返回 if(head == null) return head; ListNode n = head; head = null; ListNode m = head; while (n!= null){ m = n;//将节点m设为待断开节点 n = m.next;//将节点n设为待断开节点的后继结点 m.next = head;//将节点m和链表断开,其后继节点设为反转链表的头引用 head = m;//将反转链表的头引用更新为m } return head; } }
移除链表元素
删除链表中等于给定值 val 的所有节点。
public class Solution { public ListNode RemoveElements(ListNode head, int val) { if(head==null)return null; ListNode pre=head,curr=head; while(curr!=null){ //若head为要删除的节点 if(head.val==val){ head=head.next; pre=curr=head; continue; } //删除节点 if(curr.val==val){ pre.next=curr.next; curr=pre.next; } //遍历链表 else{ pre=curr; curr=curr.next; } } return head; } }
奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。
请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
public class Solution { public ListNode OddEvenList(ListNode head) { if(head==null)return null;//空链表返回空值 ListNode p=head,list=p.next,q=list;//list是偶链表的头结点 while(p.next!=null&&q.next!=null){ p.next=p.next.next;//奇链表连接奇节点断开偶节点 q.next=q.next.next;//偶链表连接偶节点断开奇节点 p=p.next;//奇偶链表指针步进 q=q.next; } p.next=list;//奇偶链表合并返回 return head; } }
回文链表
请判断一个链表是否为回文链表。
public class Solution { public bool IsPalindrome(ListNode head) { if(head==null)return true; ListNode low=head,fast=head,newNode=head,next=null; //快慢指针步进,快指针到头后慢指针停留在中间位置或者中间前一位 while(fast.next!=null&&fast.next.next!=null){ low=low.next; fast=fast.next.next; } low=ReverseList(low.next);//将后半部分链表反转,然后和前半部分链表比较 while(low!=null){ if(low.val!=newNode.val)return false; low=low.next; newNode=newNode.next; } return true; } public ListNode ReverseList(ListNode head) { //链表为空则返回 if(head == null) return head; ListNode n = head; head = null; ListNode m = head; while (n!= null){ m = n;//将节点m设为待断开节点 n = m.next;//将节点n设为待断开节点的后继结点 m.next = head;//将节点m和链表断开,其后继节点设为反转链表的头引用 head = m;//将反转链表的头引用更新为m } return head; } }