题目描述:
输入一个链表,输出该链表中倒数第k个结点。
解题思路:倒数第k个节点,正数第(size-k+1) 节点
public ListNode FindKthToTail(ListNode head,int k) { if(head==null || k<=0 || k>size(head)){ return null; } int n=size(head)-k+1; while(n>1){ head=head.next; n--; } return head; } public int size(ListNode head){ int count=0; while(head!=null){ count++; head=head.next; } return count; }
解题思路二:使用两个指针,相差k个,当后面的指针到链表最后时,前面的指针最倒数第k个节点(待更新)
题目描述:
输入一个链表,反转链表后,输出新链表的表头。
public ListNode ReverseList(ListNode head) { if(head==null) return null; ListNode reversedHead=null; ListNode current=head; ListNode tmp=null; ListNode pre=null; while(current!=null){ tmp=current.next; current.next=pre; if(tmp==null) reversedHead=current; pre=current; current=tmp; } return reversedHead; }
题目三:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
遍历两个链表,每个值一 一比较,移动。添加
public ListNode Merge(ListNode list1,ListNode list2) { ListNode head = null; ListNode tmp = null; ListNode current = null; while(list1!=null && list2!=null){ if(list1.val>list2.val){ current=list2; list2=current.next; tmp=current; tmp.next=null;//清空插入节点的后面的值 head=add(head,tmp); }else{ current=list1; list1=current.next; tmp=current; tmp.next=null; head=add(head,tmp); } } while(list1!=null){ current=list1; list1=current.next; tmp=current; tmp.next=null; head=add(head,tmp); } while(list2!=null){ current=list2; list2=current.next; tmp=current; tmp.next=null; head=add(head,tmp); } return head; } public ListNode add(ListNode head,ListNode node){ if(head==null){ head=node; }else{ ListNode current=head; while(current.next!=null){ current=current.next; } current.next=node; } return head; }